ZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0ZTg2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2JjNzIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYnVpbGQueG1sCi1qYXZhQ29tcGlsZXIuLi5hcmdzCi1AZG90Ci1vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZV8xLjAuMTAyLjIwMDgwNDAyMDIwNC5qYXIKLXRlbXAuZm9sZGVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjczZDJhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc1ODU1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMjQgMTI6NDA6NTMgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy8vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb25zdW1wdGlvbi9jb3JlL21lc3NhZ2VzL0F4aXMyQ29uc3VtcHRpb25VSS5wcm9wZXJ0aWVzPUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZDc1Y2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0jU3VuIE1heSAwNiAxNzozMjozOCBMS1QgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDUwOTczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlUExVR0lOX05BTUUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjEwNS5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLnBsdWdpbi5XZWJTZXJ2aWNlQXhpczJDb25zdW1wdGlvbkNvcmVQbHVnaW4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS51aS5pZGUsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmUsCi0gb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlciwKLSBvcmcuZWNsaXBzZS5qc3Qud3MsCi0gb3JnLmVjbGlwc2UuanN0LndzLnVpLAotIG9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWksCi0gb3JnLmVjbGlwc2Uud3N0LndzLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWksCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcywKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LAotIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZCwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS5kYXRhLAotIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLm1lc3NhZ2VzLAotIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLnBsdWdpbiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS51dGlscywKLSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS5kYXRhCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUJ1bmRsZS1WZW5kb3I6ICVQTFVHSU5fUFJPVklERVIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc5OWJkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdhNjFmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYyBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIFdTTzIgSW5jIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0jIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIDIwMDcwMTMwICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIAotIwkJCQkJCQkJCQkJQXhpczIgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSMgMjAwNzA1MDIgICAxODQzMDIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgRml4IGNvcHlyaWdodCBmb3IgQXhpczIgcGx1Z2lucwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWY3MWFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBXU08yIEluYy4gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSMgLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgMjAwNzA0MjggICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgCi0jIAkJCQkJCQkJCQkgQXhpczIgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSMgMjAwNzA1MDEgICAxODQ2MTcgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgUHJvdmlkZSBwbHVnaW4gZGV0YWlscwotIyAyMDA3MDUwNyAgIDE4NTY4NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0jIDIwMDgwNTMwICAgMjM0ODQxIGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuLCBDaGFuZ2UgcGx1Z2luIHByb3ZpZGVyIHRvIEVjbGlwc2Uub3JnCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgTWVzc2FnZXMgaW4gcGx1Z2luLnhtbC4KLSMKLVBMVUdJTl9OQU1FPVdlYnNlcnZpY2UgQXhpczIgQ29uc3VtcHRpb24gQ29yZSBQbHVnLWluCi1QTFVHSU5fUFJPVklERVI9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb25zdW1wdGlvbi9jb3JlL2NvbW1hbmQvQXhpczJDbGllbnRDb2RlZ2VuQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvbnN1bXB0aW9uL2NvcmUvY29tbWFuZC9BeGlzMkNsaWVudENvZGVnZW5Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZjNlYzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvbnN1bXB0aW9uL2NvcmUvY29tbWFuZC9BeGlzMkNsaWVudENvZGVnZW5Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBXU08yIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMjA1ICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIAotICogCQkJCQkJCQkJCSAgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSAqIDIwMDcwMjA2ICAgMTcyMTg2IHNhbmRha2l0aEB3c28yLmNvbQktIEZpeCBmb3IgMTcyMTg2LCBBZGRlZCBhIGNoZWNrIHRvIG92ZXJjb21lIHRoZSBpc3N1ZS4KLSAqIDIwMDcwNDI2ICAgMTgzMDQ2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSAqIDIwMDcwNTA3ICAgMTg1Mzk4IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSAqIDIwMDcwODEzICAgMTk2MTczICBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBGaXggMTk2MTczLCBEV1AgY3VzdG9tIGxvY2F0aW9uIGZpeAotICogMjAwNzA4MTQgICAxODc4NDAgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgRml4aW5nIDE4Nzg0MCBJVEUgbWVzc2FnZQotICogMjAwNzA4MTQgICAxOTM1OTMgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgY3VzdG9tIHBhY2thZ2UgbmFtZSBmaXgKLSAqIDIwMDcwODI0ICAgMjAwNTE1IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIE5PTi1OTFMgbW92ZSB0byBzZXBlcmF0ZSBmaWxlCi0gKiAyMDA4MDIxMyAgIDIxODkxMCBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICogMjAwODA2MjEgICAyMDAwNjkgc2FtaW5kYXdAd3NvMi5jb20gLSBTYW1pbmRhIFdpamVyYXRuZSwgc2F2aW5nIHRoZSByZXRyaWV2ZWQgV1NETCBzbyBubyBuZWVkIHRvIHJldHJpZXZlIGl0IGFnYWluIAotICogMjAwODA2MTYgICAyMzczNjMgc2FtaW5kYXdAd3NvMi5jb20gLSBTYW1pbmRhIFdpamVyYXRuZSwgZ2V0IFJlc291cmNlQ29udGV4dCBmcm9tIGVudmlyb25tZW50IGluc3RlYWQgb2YgcHJlZmVyZW5jZQotICogMjAwODA5MjQgICAyNDc5Mjkgc2FtaW5kYXdAd3NvMi5jb20gLSBTYW1pbmRhIFdpamVyYXRuZSwgc291cmNlIGZvbGRlciBub3QgY29ycmVjdGx5IHNldAotICogMjAwOTAzMDcgICAxOTY5NTQgc2FtaW5kYXdAd3NvMi5jb20gLSBTYW1pbmRhIFdpamVyYXRuZSwgU3VwcG9ydCBYTUxCZWFucyBkYXRhIGJpbmRpbmcKLSAqIDIwMDkxMjA3ICAgMTkzOTk2IHNhbWluZGF3QHdzbzIuY29tIC0gU2FtaW5kYSBXaWplcmF0bmUsIHNlbGVjdGluZyBhIHNwZWNpZmljIHNlcnZpY2UvcG9ydG5hbWUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLmRhdGEuRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLm1lc3NhZ2VzLkF4aXMyQ29uc3VtcHRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLnV0aWxzLkNvbnRlbnRDb3B5VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUudXRpbHMuV1NETDJKYXZhR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLnV0aWxzLldTRExQcm9wZXJ0eVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb25zdGFudC5BeGlzMkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS51dGlscy5BeGlzMkNvcmVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS51dGlscy5DbGFzc0xvYWRpbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLnV0aWxzLkZhY2V0Q29udGFpbmVyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUudXRpbHMuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSVN0YXR1c0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIEF4aXMyQ2xpZW50Q29kZWdlbkNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0JCi0JICBwcml2YXRlIERhdGFNb2RlbCBtb2RlbDsKLQkJCi0JICBwdWJsaWMgQXhpczJDbGllbnRDb2RlZ2VuQ29tbWFuZCggRGF0YU1vZGVsIG1vZGVsICl7Ci0JICAgIHRoaXMubW9kZWwgPSBtb2RlbDsgIAotCSAgfQotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykKLQkJCQkJCQkJCQkJCQkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsgIAotCQlJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBnZXRFbnZpcm9ubWVudCgpOwotCQlJU3RhdHVzSGFuZGxlciBzdGF0dXNIYW5kbGVyID0gZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpOwkKLQkJCi0JCVN0cmluZyB3b3Jrc3BhY2VEaXJlY3RvcnkgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLgotCQkJCQkJCQkJCQkJCWdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCQlTdHJpbmcgY3VycmVudER5bmFtaWNXZWJQcm9qZWN0RGlyID0gRmFjZXRDb250YWluZXJVdGlscy5nZXRQcm9qZWN0Um9vdCgKLQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuZ2V0V2ViUHJvamVjdE5hbWUoKSkudG9PU1N0cmluZygpOwotCQlTdHJpbmcgbWF0YWRhdGFEaXIgPSBGaWxlVXRpbHMuYWRkQW5vdGhlck5vZGVUb1BhdGgoCi0JCQkJCQkJCQkJd29ya3NwYWNlRGlyZWN0b3J5LAotCQkJCQkJCQkJCUF4aXMyQ29uc3RhbnRzLkRJUl9ET1RfTUVUQURBVEEpOwotCSAgICBTdHJpbmcgbWF0YWRhdGFQbHVnaW5zRGlyID0gRmlsZVV0aWxzLmFkZEFub3RoZXJOb2RlVG9QYXRoKAotCSAgICAJCQkJCQkJCW1hdGFkYXRhRGlyLAotCSAgICAJCQkJCQkJCUF4aXMyQ29uc3RhbnRzLkRJUl9ET1RfUExVR0lOUyk7Ci0JICAgIFN0cmluZyBtYXRhZGF0YUF4aXMyRGlyID0gRmlsZVV0aWxzLmFkZEFub3RoZXJOb2RlVG9QYXRoKAotCSAgICAJCQkJCQkJCQltYXRhZGF0YVBsdWdpbnNEaXIsIAotCSAgICAJCQkJCQkJCQlBeGlzMkNvbnN0YW50cy5BWElTMl9QUk9KRUNUKTsKLQkJU3RyaW5nIHRlbXBDb2RlZ2VuT3V0cHV0TG9jYXRpb24gPSBGaWxlVXRpbHMuYWRkQW5vdGhlck5vZGVUb1BhdGgoCi0JCQkJCQkJCQkJCW1hdGFkYXRhQXhpczJEaXIsIAotCQkJCQkJCQkJCQlBeGlzMkNvbnN0YW50cy5DT0RFR0VOX1JFU1VMVFMpOwotCQlGaWxlIHRlbXBDb2RlZ2VuT3V0cHV0TG9jYXRpb25GaWxlID0gbmV3IEZpbGUodGVtcENvZGVnZW5PdXRwdXRMb2NhdGlvbik7Ci0JCWlmICh0ZW1wQ29kZWdlbk91dHB1dExvY2F0aW9uRmlsZS5leGlzdHMoKSl7Ci0JCQlGaWxlVXRpbHMuZGVsZXRlRGlyZWN0b3JpZXModGVtcENvZGVnZW5PdXRwdXRMb2NhdGlvbik7Ci0JCX0KLQkJRmlsZVV0aWxzLmNyZWF0ZURpcmVjdG9yeXModGVtcENvZGVnZW5PdXRwdXRMb2NhdGlvbik7Ci0JCVdTREwySmF2YUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgV1NETDJKYXZhR2VuZXJhdG9yKCk7IAotICAgICAgCi0JCS8vQXhpc1NlcnZpY2Ugc2VydmljZTsKLQkJT2JqZWN0IGF4aXNTZXJ2aWNlSW5zdGFuY2U7Ci0JCQotCQlTdHJpbmcgdHJhbnNmb3JtZXJGYWN0b3J5ID0gbnVsbDsKLQkJYm9vbGVhbiB0cmFuc2Zvcm1lckZhY3RvcnlNb2RpZmllZCA9IGZhbHNlOwotCQkKLQl0cnkgewotCQkvLyB1c2UgdGhlIHhhbGFuIHRyYW5zZm9ybWVyIGZhY3RvcnkgaWYgbG9hZGFibGUKLQkJdHJ5IHsKLQkJCXRyYW5zZm9ybWVyRmFjdG9yeSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3RvcnkiKTsKLQkJCUNsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yLlRyYW5zZm9ybWVyRmFjdG9yeUltcGwiKTsKLQkJCVN0cmluZyBtb2RpZmllZFRyYW5zZm9ybWVyRmFjdG9yeSA9ICJvcmcuYXBhY2hlLnhhbGFuLnByb2Nlc3Nvci5UcmFuc2Zvcm1lckZhY3RvcnlJbXBsIjsKLQkJCWlmICghbW9kaWZpZWRUcmFuc2Zvcm1lckZhY3RvcnkuZXF1YWxzKHRyYW5zZm9ybWVyRmFjdG9yeSkpIHsKLQkJCQlTeXN0ZW0uc2V0UHJvcGVydHkoImphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5IiwgbW9kaWZpZWRUcmFuc2Zvcm1lckZhY3RvcnkpOwotCQkJCXRyYW5zZm9ybWVyRmFjdG9yeU1vZGlmaWVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQljYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBJZiBjbGFzcyBub3QgZm91bmQsIGtlZXAgdXNpbmcgdGhlIGRlZmF1bHQgdHJhbnNmb3JtZXIgZmFjdG9yeS4KLQkJfQotCQkKLQkJLy9zZXJ2aWNlID0gZ2VuZXJhdG9yLmdldEF4aXNTZXJ2aWNlKG1vZGVsLmdldFdzZGxVUkkoKSk7Ci0JCUNsYXNzTG9hZGluZ1V0aWwuc2V0SW5pdEJ5Q2xpZW50KHRydWUpOwotCQlDbGFzc0xvYWRpbmdVdGlsLmNsZWFuQW50Q2xhc3NMb2FkZXIoKTsKLQkJQ2xhc3NMb2FkaW5nVXRpbC5pbml0KG1vZGVsLmdldFdlYlByb2plY3ROYW1lKCkpOwotCQlheGlzU2VydmljZUluc3RhbmNlID0gZ2VuZXJhdG9yLmdldEF4aXNTZXJ2aWNlKG1vZGVsLmdldFdzZGxVUkkoKSxtb2RlbC5nZXRTZXJ2aWNlUU5hbWUoKSxtb2RlbC5nZXRQb3J0TmFtZSgpKTsKLQkJTWFwIG9wdGlvbnNNYXAgPSBnZW5lcmF0b3IuZmlsbE9wdGlvbk1hcCgJCi0JCQltb2RlbC5pc0FTeW5jKCksIC8vYXN5bmMKLSAgICAgICAgICAgIG1vZGVsLmlzU3luYygpLCAvL3N5bmMKLSAgICAgICAgICAgIGZhbHNlLCAgLy9zZXJ2aXJzaWRlIGZhbHNlIGFsd2F5cwotICAgICAgICAgICAgZmFsc2UsICAvL3NlcnZpY2VzLnhtbCBmYWxzZSBhbHdheXMKLSAgICAgICAgICAgIG1vZGVsLmlzVGVzdENhc2VDaGVjaygpLAotICAgICAgICAgICAgbW9kZWwuaXNHZW5lcmF0ZUFsbENoZWNrKCksCi0gICAgICAgICAgICAobW9kZWwuZ2V0U2VydmljZU5hbWUoKSE9bnVsbCk/bW9kZWwuZ2V0U2VydmljZU5hbWUoKTpudWxsLAotICAgICAgICAgICAgKG1vZGVsLmdldFBvcnROYW1lKCkhPW51bGwpP21vZGVsLmdldFBvcnROYW1lKCk6bnVsbCwKLSAgICAgICAgICAgIChtb2RlbC5nZXREYXRhYmluZGluZ1R5cGUoKS50b0xvd2VyQ2FzZSgpIT1udWxsKQotICAgICAgICAgICAgCQkJP21vZGVsLmdldERhdGFiaW5kaW5nVHlwZSgpLnRvTG93ZXJDYXNlKCkKLSAgICAgICAgICAgIAkJCTpudWxsLAotICAgICAgICAgICAgKG1vZGVsLmdldFdzZGxVUkkoKSE9bnVsbCk/bW9kZWwuZ2V0V3NkbFVSSSgpOm51bGwsCi0gICAgICAgICAgICAobW9kZWwuZ2V0UGFja2FnZVRleHQoKSE9bnVsbCk/bW9kZWwuZ2V0UGFja2FnZVRleHQoKTpudWxsLAotICAgICAgICAgICAgImphdmEiLAotICAgICAgICAgICAgdGVtcENvZGVnZW5PdXRwdXRMb2NhdGlvbiwKLSAgICAgICAgICAgIEF4aXMyQ29yZVV0aWxzLmdldFNvdXJjZUZvbGRlcihtb2RlbC5nZXRXZWJQcm9qZWN0TmFtZSgpKSwKLSAgICAgICAgICAgIG1vZGVsLmdldE5hbWVzcGFzZVRvUGFja2FnZU1hcHBpbmcoKSwKLSAgICAgICAgICAgIGZhbHNlCS8vU2VydmVyc2lkZSBpbnRlcmZhY2UgYWx3YXlzIGZhbHNlCi0gICAgICAgICAgICk7IAotICAgICAgCi0gICAgICAgIC8vQ29kZUdlbkNvbmZpZ3VyYXRpb24gY29kZWdlbkNvbmZpZyA9IG5ldyBDb2RlR2VuQ29uZmlndXJhdGlvbihzZXJ2aWNlLCBvcHRpb25zTWFwKTsKLQkJQ2xhc3MgQ29kZUdlbkNvbmZpZ3VyYXRpb25DbGFzcyA9IENsYXNzTG9hZGluZ1V0aWwKLQkJCQkubG9hZENsYXNzRnJvbUFudENsYXNzTG9hZGVyKCJvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuQ29uZmlndXJhdGlvbiIpOwotCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwotCQkvL0ZpeCBmb3IgdGhlIEF4aXMyIDEuMiAKLQkJLy9Db25zdHJ1Y3RvciBDb2RlR2VuQ29uZmlndXJhdGlvbkNvbnN0cnVjdG9yID0gQ29kZUdlbkNvbmZpZ3VyYXRpb25DbGFzcwotCQkvLwkJLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tde2F4aXNTZXJ2aWNlSW5zdGFuY2UuZ2V0Q2xhc3MoKSxNYXAuY2xhc3N9KTsKLQkJLy9PYmplY3QgQ29kZUdlbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSA9IENvZGVHZW5Db25maWd1cmF0aW9uQ29uc3RydWN0b3IKLQkJLy8JCS5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W117YXhpc1NlcnZpY2VJbnN0YW5jZSxvcHRpb25zTWFwfSk7Ci0JCQotCQlDb25zdHJ1Y3RvciBDb2RlR2VuQ29uZmlndXJhdGlvbkNvbnN0cnVjdG9yID0gQ29kZUdlbkNvbmZpZ3VyYXRpb25DbGFzcwotCQkJCS5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXXtNYXAuY2xhc3N9KTsKLQkJT2JqZWN0IENvZGVHZW5Db25maWd1cmF0aW9uSW5zdGFuY2UgPSBDb2RlR2VuQ29uZmlndXJhdGlvbkNvbnN0cnVjdG9yCi0JCQkJLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXXtvcHRpb25zTWFwfSk7Ci0JCQotCQkvLyBjb2RlZ2VuQ29uZmlnLmFkZEF4aXNTZXJ2aWNlKHNlcnZpY2UpOwotCQlNZXRob2QgYWRkQXhpc1NlcnZpY2VNZXRob2QgPSBDb2RlR2VuQ29uZmlndXJhdGlvbkNsYXNzCi0JCQkJLmdldE1ldGhvZCgiYWRkQXhpc1NlcnZpY2UiLCBuZXcgQ2xhc3NbXXsgYXhpc1NlcnZpY2VJbnN0YW5jZS5nZXRDbGFzcygpfSk7Ci0JCWFkZEF4aXNTZXJ2aWNlTWV0aG9kLmludm9rZShDb2RlR2VuQ29uZmlndXJhdGlvbkluc3RhbmNlLCAKLQkJCQkJCQluZXcgT2JqZWN0W117YXhpc1NlcnZpY2VJbnN0YW5jZX0pOwotCQkKLSAgICAgICAgLy9zZXQgdGhlIHdzZGwgZGVmaW5pc2lvbiBmb3IgY29kZWdlbiBjb25maWcgZm9yIHNrZWxldG9uIGdlbmVyYXJpb24uCi0gICAgICAgIFdTRExQcm9wZXJ0eVJlYWRlciByZWFkZXIgPSBuZXcgV1NETFByb3BlcnR5UmVhZGVyKG1vZGVsKTsKLSAgICAgICAgcmVhZGVyLnJlYWRXU0RMKG1vZGVsLmdldFdlYlByb2plY3ROYW1lKCksbW9kZWwuZ2V0V3NkbFVSSSgpKTsKLSAgICAgICAgT2JqZWN0IHdzZGxEZWZpbml0aW9uSW5zdGFuY2UgPSByZWFkZXIuZ2V0V3NkbERlZmluaXRpb25JbnN0YW5jZSgpOwotICAgICAgICAvL0NsYXNzIERlZmluaXRpb25DbGFzcyA9IENsYXNzTG9hZGluZ1V0aWwubG9hZENsYXNzRnJvbUFudENsYXNzTG9hZGVyKCJqYXZheC53c2RsLkRlZmluaXRpb24iKTsKLSAgICAgICAgLy9jb2RlZ2VuQ29uZmlnLnNldFdzZGxEZWZpbml0aW9uKHdzZGxEZWZpbml0aW9uKTsKLQkJTWV0aG9kIHNldFdzZGxEZWZpbml0aW9uTWV0aG9kID0gQ29kZUdlbkNvbmZpZ3VyYXRpb25DbGFzcwotCQkJCS5nZXRNZXRob2QoInNldFdzZGxEZWZpbml0aW9uIiwgbmV3IENsYXNzW117cmVhZGVyLmdldFdzZGxEZWZpbml0aW9uQ2xhc3MoKX0pOwotCQlzZXRXc2RsRGVmaW5pdGlvbk1ldGhvZC5pbnZva2UoQ29kZUdlbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSwgCi0JCQkJCW5ldyBPYmplY3RbXXt3c2RsRGVmaW5pdGlvbkluc3RhbmNlfSk7ICAgICAgIAotICAgICAgICAKLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCi0JCQotICAgICAgICAvL3NldCB0aGUgYmFzZVVSSQotICAgICAgICAvL2NvZGVnZW5Db25maWcuc2V0QmFzZVVSSShnZW5lcmF0b3IuZ2V0QmFzZVVyaShtb2RlbC5nZXRXc2RsVVJJKCkpKTsKLQkJCi0JCU1ldGhvZCBzZXRCYXNlVVJJTWV0aG9kID0gQ29kZUdlbkNvbmZpZ3VyYXRpb25DbGFzcwotCQkJCS5nZXRNZXRob2QoInNldEJhc2VVUkkiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KTsKLQkJc2V0QmFzZVVSSU1ldGhvZC5pbnZva2UoQ29kZUdlbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSwgCi0JCQkJCQkJCW5ldyBPYmplY3RbXXtnZW5lcmF0b3IuZ2V0QmFzZVVyaShtb2RlbC5nZXRXc2RsVVJJKCkpfSk7Ci0JCQotCQkvL0dldCB0aGUgbmFtZXNwYWNlIGZyb20gdGhlIEF4aXNTZXJ2aWNlIGFuZCBzZXQgaXQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gCi0JCUNsYXNzIEF4aXNTZXJ2aWNlQ2xhc3MgPSBDbGFzc0xvYWRpbmdVdGlsCi0JCQkJCS5sb2FkQ2xhc3NGcm9tQW50Q2xhc3NMb2FkZXIoIm9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2UiKTsKLQotCQlNZXRob2QgZ2V0VGFyZ2V0TmFtZXNwYWNlTWV0aG9kID0gQXhpc1NlcnZpY2VDbGFzcy5nZXRNZXRob2QoImdldFRhcmdldE5hbWVzcGFjZSIsIG51bGwpOwotCQlPYmplY3QgdGFyZ2V0TmFtZXNwYWNlID0gZ2V0VGFyZ2V0TmFtZXNwYWNlTWV0aG9kLmludm9rZShheGlzU2VydmljZUluc3RhbmNlLCBudWxsKTsKLQkJCi0JCU9iamVjdCBzdHJpbmdSZXR1cm4gPSBudWxsOwotCQlpZiAobW9kZWwuZ2V0UGFja2FnZVRleHQoKSE9bnVsbCkgewotCQkJc3RyaW5nUmV0dXJuID0gbW9kZWwuZ2V0UGFja2FnZVRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCUNsYXNzIFVSTFByb2Nlc3NvckNsYXNzID0gQ2xhc3NMb2FkaW5nVXRpbAotCQkJCQkJLmxvYWRDbGFzc0Zyb21BbnRDbGFzc0xvYWRlcigib3JnLmFwYWNoZS5heGlzMi51dGlsLlVSTFByb2Nlc3NvciIpOwotCQkJTWV0aG9kIG1ha2VQYWNrYWdlTmFtZU1ldGhvZCA9IFVSTFByb2Nlc3NvckNsYXNzCi0JCQkJCQkuZ2V0TWV0aG9kKCJtYWtlUGFja2FnZU5hbWUiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KTsKLQkJCXN0cmluZ1JldHVybiA9IG1ha2VQYWNrYWdlTmFtZU1ldGhvZC5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtde3RhcmdldE5hbWVzcGFjZX0pOwotCQl9Ci0KLQkJCi0JCW1vZGVsLnNldFBhY2thZ2VUZXh0KHN0cmluZ1JldHVybi50b1N0cmluZygpKTsKLQkJCi0JCU1ldGhvZCBzZXRQYWNrYWdlTmFtZU1ldGhvZCA9IENvZGVHZW5Db25maWd1cmF0aW9uQ2xhc3MKLQkJCQkJLmdldE1ldGhvZCgic2V0UGFja2FnZU5hbWUiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KTsKLQkJc2V0UGFja2FnZU5hbWVNZXRob2QuaW52b2tlKENvZGVHZW5Db25maWd1cmF0aW9uSW5zdGFuY2UsIG5ldyBPYmplY3RbXXtzdHJpbmdSZXR1cm59KTsKLQkJCi0gICAgICAgIC8vbmV3IENvZGVHZW5lcmF0aW9uRW5naW5lKGNvZGVnZW5Db25maWcpLmdlbmVyYXRlKCk7Ci0JCQotCQlDbGFzcyBDb2RlR2VuZXJhdGlvbkVuZ2luZUNsYXNzID0gQ2xhc3NMb2FkaW5nVXRpbAotCQkJCS5sb2FkQ2xhc3NGcm9tQW50Q2xhc3NMb2FkZXIoIm9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5lcmF0aW9uRW5naW5lIik7Ci0JCUNvbnN0cnVjdG9yIENvZGVHZW5lcmF0aW9uRW5naW5lQ29uc3RydWN0b3IgPSBDb2RlR2VuZXJhdGlvbkVuZ2luZUNsYXNzCi0JCQkJCS5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXXtDb2RlR2VuQ29uZmlndXJhdGlvbkluc3RhbmNlLmdldENsYXNzKCl9KTsKLQkJT2JqZWN0IENvZGVHZW5lcmF0aW9uRW5naW5lSW5zdGFuY2UgID0gQ29kZUdlbmVyYXRpb25FbmdpbmVDb25zdHJ1Y3RvcgotCQkJCQkubmV3SW5zdGFuY2UobmV3IE9iamVjdFtde0NvZGVHZW5Db25maWd1cmF0aW9uSW5zdGFuY2V9KTsKLQkJCi0JCS8vSW52b2tlIENvZGVnZW4gTWV0aG9kCi0JCU1ldGhvZCBnZW5lcmF0ZU1ldGhvZCA9IENvZGVHZW5lcmF0aW9uRW5naW5lQ2xhc3MuZ2V0TWV0aG9kKCJnZW5lcmF0ZSIsIG51bGwpOwotCQlnZW5lcmF0ZU1ldGhvZC5pbnZva2UoQ29kZUdlbmVyYXRpb25FbmdpbmVJbnN0YW5jZSwgbnVsbCk7Ci0gICAgICAKLQkJLy9Db3B5IHRoZSBleGlzdGluZyBjb2RlZ2VuIHJlc3VsdHMgdG8gdGhlIGN1cnJlbnQgcHJvamVjdAotICAgICAgICBDb250ZW50Q29weVV0aWxzIGNvbnRlbnRDb3B5VXRpbHMgPSBuZXcgQ29udGVudENvcHlVdGlscyhnZXRFbnZpcm9ubWVudCgpKTsKLQkgICAgc3RhdHVzID0gY29udGVudENvcHlVdGlscy5jb3B5RGlyZWN0b3J5UmVjdXJzaXZlbHlJbnRvV29ya3NwYWNlKAotCSAgICAJCQkJCQkJdGVtcENvZGVnZW5PdXRwdXRMb2NhdGlvbiwgCi0JICAgIAkJCQkJCQljdXJyZW50RHluYW1pY1dlYlByb2plY3REaXIsIAotCSAgICAJCQkJCQkJbW9uaXRvciwgCi0JICAgIAkJCQkJCQlzdGF0dXNIYW5kbGVyKTsKLQkgICAgCi0JICAgIElQcm9qZWN0IHByb2plY3QgPSBGYWNldENvbnRhaW5lclV0aWxzLmdldFByb2plY3ROYW1lKG1vZGVsLmdldFdlYlByb2plY3ROYW1lKCkpOwotCSAgICBJRm9sZGVyIGZvbGRlciA9IHByb2plY3QuZ2V0Rm9sZGVyKCJyZXNvdXJjZXMiKTsKLQkgICAgaWYgKGZvbGRlci5leGlzdHMoKSl7Ci0JICAgIAlBeGlzMkNvcmVVdGlscy5hZGRSZXNvdXJjZXNGb2xkZXJBc0NsYXNzUGF0aChwcm9qZWN0KTsKLQkgICAgfQotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCXN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKE5MUy5iaW5kKAotCQkJCQkJCQkJCQlBeGlzMkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5FUlJPUl9DT0RFR0VOX0VYQ0VQVElPTiwKLQkJCQkJCQkJCQkJbmV3IFN0cmluZ1tdeyIgOiAiK2UuZ2V0Q2F1c2UoKX0pLAotCQkJCQkJCQkJCWUpOwotCQllbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsgCi0JfSBmaW5hbGx5IHsKLQkJaWYgKHRyYW5zZm9ybWVyRmFjdG9yeU1vZGlmaWVkKSB7Ci0JCQkvLyByZXN0b3JlIHRvIHRoZSBvcmlnaW5hbCBUcmFuc2Zvcm1lckZhY3RvcnkKLQkJCWlmICh0cmFuc2Zvcm1lckZhY3RvcnkgPT0gbnVsbCkgewotCQkJCVN5c3RlbS5jbGVhclByb3BlcnR5KCJqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeSIpOyAKLQkJCX0gZWxzZSB7Ci0JCQkJU3lzdGVtLnNldFByb3BlcnR5KCJqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeSIsIHRyYW5zZm9ybWVyRmFjdG9yeSk7IAotCQkJfQotCQl9Ci0JfQotCi0JCXJldHVybiBzdGF0dXM7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvbnN1bXB0aW9uL2NvcmUvY29tbWFuZC9BeGlzMkNsaWVudERlZmF1bHRpbmdDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29uc3VtcHRpb24vY29yZS9jb21tYW5kL0F4aXMyQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVhNWVhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29uc3VtcHRpb24vY29yZS9jb21tYW5kL0F4aXMyQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuLCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMjA1ICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIAotICogCQkJCQkJCQkJCSAgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSAqIDIwMDcwNDI2ICAgMTgzMDQ2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSAqIDIwMDcwNTA4ICAgMTc1MDMwIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIFdTREwgbm90IHBhc3NlZCB0byBBeGlzMiBjbGllbnQgZml4Ci0gKiAyMDA3MDYxMiAgIDE5MjA0NyBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCAxOTIwNDcKLSAqIDIwMDcwNjEyICAgMTkyMDQ3IGthdGh5QGNhLmlibS5jb20gICAtIEthdGh5IENoYW4KLSAqIDIwMDcwODI0ICAgMjAwNTE1IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIE5PTi1OTFMgbW92ZSB0byBzZXBlcmF0ZSBmaWxlCi0gKiAyMDA4MDYyMiAgIDI0MTE3MCBzYW1pbmRhd0B3c28yLmNvbSAtIFNhbWluZGEgV2lqZXJhdG5lLCBBeGlzMiBwcmVmZXJlbmNlcyByZXNwZWN0ZWQgd2hlbiBjbGljayBmaW5pc2ggaW4gMXN0IHBhZ2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS5kYXRhLkRhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS51dGlscy5EZWZhdWx0Q29kZWdlblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUuY29uc3RhbnQuQXhpczJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JV2ViU2VydmljZUNsaWVudDsKLQotcHVibGljIGNsYXNzIEF4aXMyQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0JCi0JRGF0YU1vZGVsIG1vZGVsOwotCXByaXZhdGUgSVdlYlNlcnZpY2VDbGllbnQgd3M7Ci0JSVN0YXR1cyBzdGF0dXM7Ci0JCi0JcHVibGljIEF4aXMyQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQoRGF0YU1vZGVsIG1vZGVsLCBJV2ViU2VydmljZUNsaWVudCB3cyl7Ci0JCXRoaXMubW9kZWw9bW9kZWw7Ci0JCXRoaXMud3M9d3M7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykKLQkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkvL0RlZmF1bHQgU2V0dGluZ3MgZm9yIHRoZSBDb2RlZ2VuZXJhdGlvbgotCi0JCVN0cmluZyB3c2RsVVJMID0gd3MuZ2V0V2ViU2VydmljZUNsaWVudEluZm8oKS5nZXRXc2RsVVJMKCk7Ci0JCW1vZGVsLnNldFdzZGxVUkkod3NkbFVSTCk7Ci0JCQotCQlEZWZhdWx0Q29kZWdlblV0aWwgZGVmYXVsdENvZGVnZW5VdGlsID0gbmV3IERlZmF1bHRDb2RlZ2VuVXRpbChtb2RlbCk7Ci0JCWRlZmF1bHRDb2RlZ2VuVXRpbC5wb3B1bGF0ZU1vZGVsUGFyYW1zRnJvbVdTREwoKTsKLQkJCi0JCXN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCQotCXB1YmxpYyBEYXRhTW9kZWwgZ2V0V2ViU2VydmljZURhdGFNb2RlbCgpewotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29uc3VtcHRpb24vY29yZS9jb21tYW5kL0F4aXMyQ2xpZW50T3V0cHV0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvbnN1bXB0aW9uL2NvcmUvY29tbWFuZC9BeGlzMkNsaWVudE91dHB1dENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ1NzYxOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29uc3VtcHRpb24vY29yZS9jb21tYW5kL0F4aXMyQ2xpZW50T3V0cHV0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4sIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwODA2MjEgICAyMTA4MTcgc2FtaW5kYXdAd3NvMi5jb20gLSBTYW1pbmRhIFdpamVyYXRuZSwgU2V0dGluZyB0aGUgcHJveHlCZWFuIGFuZCBwcm94eUVuZFBvaW50IHZhbHVlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JV2ViU2VydmljZUNsaWVudDsKLQotCi1wdWJsaWMgY2xhc3MgQXhpczJDbGllbnRPdXRwdXRDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gewotCQotCXByaXZhdGUgSVdlYlNlcnZpY2VDbGllbnQgd3NjXzsKLQlwcml2YXRlIFN0cmluZyBwcm94eUJlYW5fOwotCXByaXZhdGUgU3RyaW5nIHByb3h5RW5kcG9pbnRfOwotCSAgCi0JCS8qKgotCQkqIERlZmF1bHQgQ1RPUgotCQkqLwotCQlwdWJsaWMgQXhpczJDbGllbnRPdXRwdXRDb21tYW5kKCkgewotCQl9Ci0JCQotCQlwdWJsaWMgQXhpczJDbGllbnRPdXRwdXRDb21tYW5kKElXZWJTZXJ2aWNlQ2xpZW50IHdzYywgSUNvbnRleHQgY29udGV4dCkgewotCQkJd3NjXyA9IHdzYzsKLQkJfQotCQkKLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgYWRhcHRhYmxlICkgCi0JewkKLQkJd3NjXy5nZXRXZWJTZXJ2aWNlQ2xpZW50SW5mbygpLnNldEltcGxVUkwocHJveHlCZWFuXyk7Ci0JCXdzY18uZ2V0V2ViU2VydmljZUNsaWVudEluZm8oKS5zZXRQcm94eUVuZHBvaW50KHByb3h5RW5kcG9pbnRfKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JICB9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm94eUJlYW4oU3RyaW5nIHByb3h5QmVhbikgewotCQl0aGlzLnByb3h5QmVhbl8gPSBwcm94eUJlYW47Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJveHlFbmRwb2ludChTdHJpbmcgcHJveHlFbmRwb2ludCkgewotCQl0aGlzLnByb3h5RW5kcG9pbnRfID0gcHJveHlFbmRwb2ludDsKLQl9Ci0JICAKLQkJCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29uc3VtcHRpb24vY29yZS9jb21tYW5kL0F4aXMyQ2xpZW50VGVzdENhc2VJbnRlZ3JhdGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29uc3VtcHRpb24vY29yZS9jb21tYW5kL0F4aXMyQ2xpZW50VGVzdENhc2VJbnRlZ3JhdGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYTgwODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvbnN1bXB0aW9uL2NvcmUvY29tbWFuZC9BeGlzMkNsaWVudFRlc3RDYXNlSW50ZWdyYXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDUxOCAgICAgICAgMTg3MzExIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEZpeGluZyB0ZXN0IHJlc291cmNlIGFkZGl0aW9uCi0gKiAyMDA3MDYwOCAgICAgICAgMTkxMDU1IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIER1cGxpY2F0ZSBjbGFzc3BhdGggZW50cnkgZml4Ci0gKiAyMDA3MDgyNCAgICAgICAgMjAwNTE1IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIE5PTi1OTFMgbW92ZSB0byBzZXBhcmF0ZSBmaWxlCi0gKiAyMDA3MTEyMSAgICAgICAgMjA1MjI3IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIGpVbml0IHByb2JsZW0gd2l0aCBwcm9qZWN0IGV4cG9ydAotICogMjAwODA2MTYgICAgICAgIDIzNzM2MyBzYW1pbmRhd0B3c28yLmNvbSAtIFNhbWluZGEgV2lqZXJhdG5lLCBnZXQgUmVzb3VyY2VDb250ZXh0IGZyb20gZW52aXJvbm1lbnQgaW5zdGVhZCBvZiBwcmVmZXJlbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLmRhdGEuRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLm1lc3NhZ2VzLkF4aXMyQ29uc3VtcHRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLnV0aWxzLkNvbnRlbnRDb3B5VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUuY29uc3RhbnQuQXhpczJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUudXRpbHMuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSVN0YXR1c0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuY29tbW9uLkJ1bmRsZVV0aWxzOwotCi0KLS8qKgotICogVGhpcyBDbGFzcyB3aWxsIGZpcnN0IGNoZWNrIHdoZXRoZXIgQXhpczIgQ2xpZW50IHdpbGwgZ2VuZXJhdGUgdGhlIFRlc3RDYXNlCi0gKiBhbmQgaWYgc28gdGhlbiBpdCB3aWxsIGludGVncmF0ZSB0aGF0IHRlc3QgdG8gdGhlIGluaXRpYXRlZCBkeW5hbWljIHdlYiBwcm9qZWN0Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgQXhpczJDbGllbnRUZXN0Q2FzZUludGVncmF0ZUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0KLSAgICBwcml2YXRlIERhdGFNb2RlbCBtb2RlbDsKLSAgICBwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHRlc3RDbGFzc1BhdGhFeGlzdHM7Ci0KLSAgICBwdWJsaWMgQXhpczJDbGllbnRUZXN0Q2FzZUludGVncmF0ZUNvbW1hbmQoSVByb2plY3QgcHJvamVjdF8sRGF0YU1vZGVsIG1vZGVsXyl7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbF87Ci0gICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3RfOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICBTdHJpbmcgd29ya3NwYWNlRGlyZWN0b3J5ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKLSAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgc2VydmljZSBnZW5lcmF0ZSB0ZXN0IGNhc2UgaXMgZW5hYmxlZAotICAgICAgICBpZihtb2RlbC5pc1Rlc3RDYXNlQ2hlY2soKSl7Ci0gICAgICAgIAl0cnl7Ci0gICAgICAgIAkvLyBUaGVuIGFkZCB0aGUgbGF0ZXN0IGp1bml0LmphciBmcm9tIHRvIHRoZSBwcm9qZWN0IGNsYXNzIHBhdGgKLSAgICAgICAgCUNvcHlKVW5pdEphclRvUHJvamVjdCh3b3Jrc3BhY2VEaXJlY3RvcnksbW9uaXRvcik7Ci0KLSAgICAgICAgICAgIC8vIG1ha2UgdGhlIHRlc3QgZm9sZGVyIGFzIHNvdXJjZSBmb2xkZXIuCi0gICAgICAgICAgICAvLyBHZXQgdGhlIFByb2plY3QgSGFuZGxlcgotICAgICAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qID0gbmV3IEphdmFQcm9qZWN0KHByb2plY3QsbnVsbCk7Ci0gICAgICAgICAgICAvLyB0byBnZXQgZXhpc3RpbmcgY2xhc3MgcGF0aCBlbnRyaWVzCi0gICAgICAgICAgICBJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGhFbnRyaWVzID0gamF2YVByb2ouZ2V0UmF3Q2xhc3NwYXRoKCk7IAotICAgICAgICAgICAgLy8gaW5jcmVhc2UgdGhlIGNsYXNzIHBhdGggZW50cmllcyBhcnJheSBieSAxIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIG5ldyBzb3VyY2UgZGlyZWN0b3J5Ci0gICAgICAgICAgICAvLyB3aGVyZSBwYXRoIGlzIHRoZSBuZXcgc291cmNlIGRpcmVjdG9yeQotICAgICAgICAgICAgSUNsYXNzcGF0aEVudHJ5IG5ld0NsYXNzcGF0aEVudHJ5ID0gSmF2YUNvcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5ld1NvdXJjZUVudHJ5KGdldFBhdGhUb1Rlc3RGb2xkZXIocHJvamVjdCx3b3Jrc3BhY2VEaXJlY3RvcnkpKTsgCi0gICAgICAgICAgIAotICAgICAgICAgICAgLy9DaGVjayB0ZXN0IGRpcmVjdG9yeSBhbHJlYWR5IGluIHRoZSBjbGFzc3BhdGggZW50cmllcy4KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NwYXRoRW50cmllcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChjbGFzc3BhdGhFbnRyaWVzW2ldLmVxdWFscyhuZXdDbGFzc3BhdGhFbnRyeSkpewotICAgICAgICAgICAgICAgIAl0ZXN0Q2xhc3NQYXRoRXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGludCBjbGFzc1BhdGhMZW5ndGggPSBjbGFzc3BhdGhFbnRyaWVzLmxlbmd0aDsKLSAgICAgICAgICAgIGlmKCF0ZXN0Q2xhc3NQYXRoRXhpc3RzKXsKLSAgICAgICAgICAgIAljbGFzc1BhdGhMZW5ndGgrPTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBJQ2xhc3NwYXRoRW50cnlbXSBuZXdDbGFzc3BhdGhFbnRyeUFycmF5ID0gbmV3IElDbGFzc3BhdGhFbnRyeVtjbGFzc1BhdGhMZW5ndGhdOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzcGF0aEVudHJpZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIAkgbmV3Q2xhc3NwYXRoRW50cnlBcnJheVtpXT0gY2xhc3NwYXRoRW50cmllc1tpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGlmIG5vdCBhbHJlYWR5IGV4aXN0IGFkZCBuZXcgQ2xhc3MgUGF0aCBFbnRyeSB0ZXN0IGRpcmVjdG9yeQotICAgICAgICAgICAJaWYoIXRlc3RDbGFzc1BhdGhFeGlzdHMpewotICAgICAgICAgICAgCW5ld0NsYXNzcGF0aEVudHJ5QXJyYXlbY2xhc3NQYXRoTGVuZ3RoLTFdID0gbmV3Q2xhc3NwYXRoRW50cnk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBqYXZhUHJvai5zZXRSYXdDbGFzc3BhdGgobmV3Q2xhc3NwYXRoRW50cnlBcnJheSxtb25pdG9yKTsKLSAgICAgICAgICAgCi0gICAgICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgCSB0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgCi0gICAgfQotICAgCi0gICAgLyoqCi0gICAgICogQ29weSB0aGUgSlVuaXQgamFyIGZyb20gdGhlIGZyYW1ld29yayBsb2NhdGlvbiB0byB0aGUgcHJvamVjdCBjbGFzc3BhdGguCi0gICAgICogQHBhcmFtIHdvcmtzcGFjZQotICAgICAqIEByZXR1cm4gYWJzb2x1dGUgcGF0aCBsb2NhdGlvbiBvZiB0aGUgY29weWluZyBmaWxlCi0gICAgICogQHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgQ29weUpVbml0SmFyVG9Qcm9qZWN0KFN0cmluZyB3b3Jrc3BhY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAJRmlsZSByZWxhdGl2ZVdlYkluZkp1bml0RmlsZSA9IG5ldyBGaWxlKEZpbGVVdGlscy5hZGRBbm90aGVyTm9kZVRvUGF0aCgKLSAgICAJCQkJCQkJCQkJCQlKMkVFVXRpbHMuZ2V0V2ViSW5mUGF0aChwcm9qZWN0KS50b09TU3RyaW5nKCksCi0gICAgCQkJCQkJCQkJCQkJQXhpczJDb25zdGFudHMuRElSX0xJQitGaWxlLnNlcGFyYXRvcisKLSAgICAJCQkJCQkJCQkJCQlBeGlzMkNvbnN0YW50cy5KVU5JVF9KQVIpKTsKLSAgICAJCi0gICAgCUZpbGUgb2JzYWx1dGVXZWJJbmZKdW5pdEZpbGUgPSBuZXcgRmlsZShGaWxlVXRpbHMuYWRkQW5vdGhlck5vZGVUb1BhdGgoCi0gICAgCQkJCQkJCQkJCQkJCQl3b3Jrc3BhY2UsIAotICAgIAkJCQkJCQkJCQkJCQkJcmVsYXRpdmVXZWJJbmZKdW5pdEZpbGUudG9TdHJpbmcoKSkpOwotICAgIAlJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBnZXRFbnZpcm9ubWVudCgpOwotCQlJU3RhdHVzSGFuZGxlciBzdGF0dXNIYW5kbGVyID0gZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpOwkKLSAgICAJQ29udGVudENvcHlVdGlscyBjb250ZW50Q29weVV0aWxzID0gbmV3IENvbnRlbnRDb3B5VXRpbHMoZ2V0RW52aXJvbm1lbnQoKSk7Ci0gICAgCWNvbnRlbnRDb3B5VXRpbHMuY29weURpcmVjdG9yeVJlY3Vyc2l2ZWx5SW50b1dvcmtzcGFjZSgKLSAgICAJCQlnZXRGcmFtZXdvcmtKdW5pdEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSwKLSAgICAJCQlvYnNhbHV0ZVdlYkluZkp1bml0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgCi0gICAgCQkJbW9uaXRvciwgc3RhdHVzSGFuZGxlcik7Ci0JCXJldHVybiBvYnNhbHV0ZVdlYkluZkp1bml0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiByZXR1cm5zIHRoZSBGcmFtZXdvcmsgSlVuaXQgRmlsZSBsb2NhdGlvbi4KLSAgICAgKiBAcmV0dXJuCi0gICAgICogQHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24KLSAgICAgKi8KLQlwcml2YXRlIEZpbGUgZ2V0RnJhbWV3b3JrSnVuaXRGaWxlKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgCUlQYXRoIGp1bml0SmFyUGF0aD1CdW5kbGVVdGlscy5nZXRKYXJyZWRQbHVnaW5QYXRoKEF4aXMyQ29uc3RhbnRzLkpVTklUX0JVTkRMRSk7Ci0gICAgCWlmIChqdW5pdEphclBhdGggIT0gbnVsbCl7Ci0gICAgCQlyZXR1cm4gbmV3IEZpbGUoRmlsZVV0aWxzLmFkZEFub3RoZXJOb2RlVG9QYXRoKGp1bml0SmFyUGF0aC50b09TU3RyaW5nKCksCi0gICAgCQkJCUF4aXMyQ29uc3RhbnRzLkpVTklUX0pBUikpOwotICAgIAl9ZWxzZXsKLSAgICAJCXRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oQXhpczJDb25zdW1wdGlvblVJTWVzc2FnZXMuRVJST1JfSlVOSVRfSkFSX05PVF9GT1VORCk7Ci0gICAgCX0KLSAgICB9Ci0KLQkvKioKLQkgKiByZXR1cm5zIHRoZSBwYXRoIHRvIHRoZSBuZXdseSBnZW5lcmF0ZWQgdGVzdCBmb2xkZXIgCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gd29ya3NwYWNlCi0JICogQHJldHVybiBJUGF0aCB0byB0aGUgdGVzdCBmb2xkZXIKLQkgKi8KLSAgICBwcml2YXRlIElQYXRoIGdldFBhdGhUb1Rlc3RGb2xkZXIoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHdvcmtzcGFjZSkgewotICAgICAgICBTdHJpbmcgcGF0aFRvVGVzdCA9IHByb2plY3QuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkgKyBGaWxlLnNlcGFyYXRvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQXhpczJDb25zdGFudHMuRElSX1RFU1Q7Ci0gICAgICAgIElQYXRoIHBhdGhUb1Rlc3RGb2xkZXIgPSBuZXcgUGF0aChwYXRoVG9UZXN0KTsKLSAgICAgICAgcmV0dXJuIHBhdGhUb1Rlc3RGb2xkZXI7Ci0gICAgfQotICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29uc3VtcHRpb24vY29yZS9jb21tYW5kL0F4aXMyV2Vic2VydmljZXNTZXJ2ZXJDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29uc3VtcHRpb24vY29yZS9jb21tYW5kL0F4aXMyV2Vic2VydmljZXNTZXJ2ZXJDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YWNlZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvbnN1bXB0aW9uL2NvcmUvY29tbWFuZC9BeGlzMldlYnNlcnZpY2VzU2VydmVyQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMTEwICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIAotICogCQkJCQkJCQkJCSAgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSAqIDIwMDgwMTE0ICAgMjA5NDExIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEZpeCBmb3IgdGhlIDIwOTQxMSwgP3dzZGwgbm90IHVwZGF0ZSAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS5kYXRhLkRhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgQXhpczJXZWJzZXJ2aWNlc1NlcnZlckNvbW1hbmQgZXh0ZW5kcwotQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gewotCi0JU3RyaW5nIHByb2plY3Q7Ci0JRGF0YU1vZGVsIG1vZGVsOwotCXB1YmxpYyBBeGlzMldlYnNlcnZpY2VzU2VydmVyQ29tbWFuZChEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwcm9qZWN0KXsKLQkJdGhpcy5tb2RlbD1tb2RlbDsKLQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQotCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCW1vZGVsLnNldFdlYlByb2plY3ROYW1lKHByb2plY3QpOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb25zdW1wdGlvbi9jb3JlL2RhdGEvRGF0YU1vZGVsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29uc3VtcHRpb24vY29yZS9kYXRhL0RhdGFNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODlkYzEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb25zdW1wdGlvbi9jb3JlL2RhdGEvRGF0YU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMTEwICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIAotICogCQkJCQkJCQkJCSAgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSAqIDIwMDcwNDI2ICAgMTgzMDQ2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSAqIDIwMDkxMjA3ICAgMTkzOTk2IHNhbWluZGF3QHdzbzIuY29tIC0gU2FtaW5kYSBXaWplcmF0bmUsIHNlbGVjdGluZyBhIHNwZWNpZmljIHNlcnZpY2UvcG9ydG5hbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS5kYXRhOwotCi1wdWJsaWMgY2xhc3MgRGF0YU1vZGVsIGV4dGVuZHMgTW9kZWx7Ci0JCi0JLy9Db25zdW1wdGlvbiBEYXRhTW9kZWwgUGFyYW1ldGVycwotCQotCXByaXZhdGUgU3RyaW5nIAlzZXJ2aWNlQ2xhc3M7Ci0JcHJpdmF0ZSBTdHJpbmcgCWRhdGFiaW5kaW5nVHlwZTsKLQlwcml2YXRlIFN0cmluZyAJbmFtZXNwYXNlVG9QYWNrYWdlTWFwcGluZzsKLQkvL0RlZmF1bHQgc2V0dGluZyBpcyB0byBnZW5lcmF0ZSBib3RoIHN5bmMgYW5kIGFzeW5jCi0JcHJpdmF0ZSBib29sZWFuCVN5bmMgPSBmYWxzZTsgCi0JcHJpdmF0ZSBib29sZWFuCUFTeW5jID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlQWxsQ2hlY2sgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gdGVzdENhc2VDaGVjayA9IGZhbHNlOwotCi0JCi0JcHVibGljIFN0cmluZyBnZXREYXRhYmluZGluZ1R5cGUoKSB7Ci0JCXJldHVybiBkYXRhYmluZGluZ1R5cGU7Ci0JfQotCXB1YmxpYyB2b2lkIHNldERhdGFiaW5kaW5nVHlwZShTdHJpbmcgZGF0YWJpbmRpbmdUeXBlKSB7Ci0JCXRoaXMuZGF0YWJpbmRpbmdUeXBlID0gZGF0YWJpbmRpbmdUeXBlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlQWxsQ2hlY2soKSB7Ci0JCXJldHVybiBnZW5lcmF0ZUFsbENoZWNrOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZUFsbENoZWNrKGJvb2xlYW4gZ2VuZXJhdGVBbGxDaGVjaykgewotCQl0aGlzLmdlbmVyYXRlQWxsQ2hlY2sgPSBnZW5lcmF0ZUFsbENoZWNrOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFzZVRvUGFja2FnZU1hcHBpbmcoKSB7Ci0JCXJldHVybiBuYW1lc3Bhc2VUb1BhY2thZ2VNYXBwaW5nOwotCX0KLQlwdWJsaWMgdm9pZCBzZXROYW1lc3Bhc2VUb1BhY2thZ2VNYXBwaW5nKFN0cmluZyBuYW1lc3Bhc2VUb1BhY2thZ2VNYXBwaW5nKSB7Ci0JCXRoaXMubmFtZXNwYXNlVG9QYWNrYWdlTWFwcGluZyA9IG5hbWVzcGFzZVRvUGFja2FnZU1hcHBpbmc7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYWNrYWdlVGV4dCgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFBhY2thZ2VUZXh0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFja2FnZVRleHQoU3RyaW5nIHBhY2thZ2VUZXh0KSB7Ci0JCXN1cGVyLnNldFBhY2thZ2VUZXh0KHBhY2thZ2VUZXh0KTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQb3J0TmFtZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFBvcnROYW1lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UG9ydE5hbWUoU3RyaW5nIHBvcnROYW1lKSB7Ci0JCXN1cGVyLnNldFBvcnROYW1lKHBvcnROYW1lKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlQ2xhc3MoKSB7Ci0JCXJldHVybiBzZXJ2aWNlQ2xhc3M7Ci0JfQotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VDbGFzcyhTdHJpbmcgc2VydmljZUNsYXNzKSB7Ci0JCXRoaXMuc2VydmljZUNsYXNzID0gc2VydmljZUNsYXNzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZU5hbWUoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRTZXJ2aWNlTmFtZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0V3NkbFVSSSgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFdzZGxVUkkoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXc2RsVVJJKFN0cmluZyB3c2RsVVJJKSB7Ci0JCXN1cGVyLnNldFdzZGxVUkkod3NkbFVSSSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzQVN5bmMoKSB7Ci0JCXJldHVybiBBU3luYzsKLQl9Ci0JcHVibGljIHZvaWQgc2V0QVN5bmMoYm9vbGVhbiBhc3luYykgewotCQlBU3luYyA9IGFzeW5jOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc1N5bmMoKSB7Ci0JCXJldHVybiBTeW5jOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRTeW5jKGJvb2xlYW4gc3luYykgewotCQlTeW5jID0gc3luYzsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNUZXN0Q2FzZUNoZWNrKCkgewotCQlyZXR1cm4gdGVzdENhc2VDaGVjazsKLQl9Ci0JcHVibGljIHZvaWQgc2V0VGVzdENhc2VDaGVjayhib29sZWFuIHRlc3RDYXNlQ2hlY2spIHsKLQkJdGhpcy50ZXN0Q2FzZUNoZWNrID0gdGVzdENhc2VDaGVjazsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb25zdW1wdGlvbi9jb3JlL2RhdGEvTW9kZWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb25zdW1wdGlvbi9jb3JlL2RhdGEvTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU3YjFmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29uc3VtcHRpb24vY29yZS9kYXRhL01vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMjEzICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIAotICogCQkJCQkJCQkJCSAgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSAqIDIwMDgwNjIxICAgMjAwMDY5IHNhbWluZGF3QHdzbzIuY29tIC0gU2FtaW5kYSBXaWplcmF0bmUsIHNhdmluZyB0aGUgcmV0cmlldmVkIFdTREwgc28gbm8gbmVlZCB0byByZXRyaWV2ZSBpdCBhZ2FpbgotICogMjAwOTEyMDcgICAxOTM5OTYgc2FtaW5kYXdAd3NvMi5jb20gLSBTYW1pbmRhIFdpamVyYXRuZSwgc2VsZWN0aW5nIGEgc3BlY2lmaWMgc2VydmljZS9wb3J0bmFtZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLmRhdGE7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS51dGlscy5DbGFzc0xvYWRpbmdVdGlsOwotCi1wdWJsaWMgY2xhc3MgTW9kZWwgewotCQotCXByaXZhdGUgU3RyaW5nICB3ZWJQcm9qZWN0TmFtZTsKLQkKLQlwcml2YXRlIGJvb2xlYW4gc2VydmVyU3RhdHVzOwotCXByaXZhdGUgU3RyaW5nICB3c2RsVVJJOwotCXByaXZhdGUgU3RyaW5nIHBvcnROYW1lOwotCXByaXZhdGUgU3RyaW5nIHNlcnZpY2VOYW1lOwotCXByaXZhdGUgT2JqZWN0IHNlcnZpY2VRTmFtZTsKLQlwcml2YXRlIFN0cmluZyBwYWNrYWdlVGV4dDsKLQlwcml2YXRlIE9iamVjdCB3c2RsRGVmaW5pdGlvbkluc3RhbmNlPW51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgd3NkbExvY2F0aW9uPSIiOwotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZVRleHQoKSB7Ci0JCXJldHVybiBwYWNrYWdlVGV4dDsKLQl9Ci0JcHVibGljIHZvaWQgc2V0UGFja2FnZVRleHQoU3RyaW5nIHBhY2thZ2VUZXh0KSB7Ci0JCXRoaXMucGFja2FnZVRleHQgPSBwYWNrYWdlVGV4dDsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRQb3J0TmFtZSgpIHsKLQkJcmV0dXJuIHBvcnROYW1lOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRQb3J0TmFtZShTdHJpbmcgcG9ydE5hbWUpIHsKLQkJdGhpcy5wb3J0TmFtZSA9IHBvcnROYW1lOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VOYW1lKCkgewotCQlyZXR1cm4gc2VydmljZU5hbWU7Ci0JfQotCXByaXZhdGUgdm9pZCBzZXRTZXJ2aWNlTmFtZShTdHJpbmcgc2VydmljZU5hbWUpIHsKLQkJdGhpcy5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFdzZGxVUkkoKSB7Ci0JCXJldHVybiB3c2RsVVJJOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRXc2RsVVJJKFN0cmluZyB3c2RsVVJJKSB7Ci0JCXRoaXMud3NkbFVSSSA9IHdzZGxVUkk7Ci0JfQotCXB1YmxpYyBib29sZWFuIGdldFNlcnZlclN0YXR1cygpIHsKLQkJcmV0dXJuIHNlcnZlclN0YXR1czsKLQl9Ci0JcHVibGljIHZvaWQgc2V0U2VydmVyU3RhdHVzKGJvb2xlYW4gYikgewotCQl0aGlzLnNlcnZlclN0YXR1cyA9IGI7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0V2ViUHJvamVjdE5hbWUoKSB7Ci0JCXJldHVybiB3ZWJQcm9qZWN0TmFtZTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0V2ViUHJvamVjdE5hbWUoU3RyaW5nIHdlYlByb2plY3ROYW1lKSB7Ci0JCXRoaXMud2ViUHJvamVjdE5hbWUgPSB3ZWJQcm9qZWN0TmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXc2RsRGVmaW5pdGlvbkluc3RhbmNlKE9iamVjdCB3c2RsRGVmaW5pdGlvbkluc3RhbmNlLCBTdHJpbmcgd3NkbExvY2F0aW9uKSB7Ci0JCWlmICh3c2RsRGVmaW5pdGlvbkluc3RhbmNlIT1udWxsKXsKLQkJCXRoaXMud3NkbERlZmluaXRpb25JbnN0YW5jZSA9IHdzZGxEZWZpbml0aW9uSW5zdGFuY2U7Ci0JCQl0aGlzLndzZGxMb2NhdGlvbiA9IHdzZGxMb2NhdGlvbjsKLQkJfQotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0V3NkbERlZmluaXRpb25JbnN0YW5jZSgpIHsKLQkJcmV0dXJuIHdzZGxEZWZpbml0aW9uSW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNXc2RsQWxyZWFkeUxvYWRlZChTdHJpbmcgZmlsZXBhdGgpIHsKLQkJcmV0dXJuIHdzZGxMb2NhdGlvbi5lcXVhbHNJZ25vcmVDYXNlKGZpbGVwYXRoKTsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIHNldFNlcnZpY2VRTmFtZSB0aGUgc2V0U2VydmljZVFOYW1lIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VRTmFtZShPYmplY3Qgc2VydmljZVFOYW1lKSB7Ci0JCXRoaXMuc2VydmljZVFOYW1lID0gc2VydmljZVFOYW1lOwotCQl0cnl7Ci0JCQlDbGFzcyBRTmFtZUNsYXNzID0gQ2xhc3NMb2FkaW5nVXRpbC5sb2FkQ2xhc3NGcm9tQW50Q2xhc3NMb2FkZXIoImphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUiKTsKLQkJCU1ldGhvZCBHZXRMb2NhbFBhcnRNZXRob2QgID0gUU5hbWVDbGFzcy5nZXRNZXRob2QoImdldExvY2FsUGFydCIsIG51bGwpOwotCQkJT2JqZWN0IHJlc3VsdExvY2FsUGFydCA9IEdldExvY2FsUGFydE1ldGhvZC5pbnZva2Uoc2VydmljZVFOYW1lLCBudWxsKTsKLQkJCXNldFNlcnZpY2VOYW1lKHJlc3VsdExvY2FsUGFydC50b1N0cmluZygpKTsKLQkJfWNhdGNoKEV4Y2VwdGlvbiBlKXsKLQkJCXNldFNlcnZpY2VOYW1lKHNlcnZpY2VRTmFtZS50b1N0cmluZygpKTsKLQkJfQotCX0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBzZXRTZXJ2aWNlUU5hbWUKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFNlcnZpY2VRTmFtZSgpIHsKLQkJcmV0dXJuIHNlcnZpY2VRTmFtZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29uc3VtcHRpb24vY29yZS9tZXNzYWdlcy9BeGlzMkNvbnN1bXB0aW9uVUkucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb25zdW1wdGlvbi9jb3JlL21lc3NhZ2VzL0F4aXMyQ29uc3VtcHRpb25VSS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDk4MjY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb25zdW1wdGlvbi9jb3JlL21lc3NhZ2VzL0F4aXMyQ29uc3VtcHRpb25VSS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0jIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIDIwMDcwMTEwICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1Y2UgdGhlIEF4aXMyIAotIwkJCQkJCQkJCQkgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSMgMjAwNzA1MTEgICAxODY0NDAgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCBmaXggMTg2NDQwCi0jIDIwMDcwNTE3ICAgMTg3MzA3IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSMgMjAwNzA1MTggICAxODczMTEgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgRml4aW5nIHRlc3QgcmVzb3VyY2UgYWRkaXRpb24KLSMgMjAwNzA2MDEgICAxOTA1MDUgcG1vb2drQGNhLmlibS5jb20gLSBQZXRlciBNb29nawotIyAyMDA4MDExNiAgIDIwOTQxMSBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbnRyb2R1Y2VkIGZvciB0aGUgRml4IDIwOTQxMQotIyAyMDA4MDEzMCAgIDIxNjk5NyBrYXRlcEB3c28yLmNvbSAtIEthdGUgUHJpY2UKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotCi1MQUJFTF9TRVJWSUNFX05BTUVfQ0FQVElPTj1TZXJ2aWNlIE5hbWUKLUxBQkVMX0dFTkVSQVRFX1RFU1RDQVNFX0NBUFRJT049R2VuZXJhdGUgYSBKVW5pdCB0ZXN0IGNhc2UgdG8gdGVzdCB0aGUgc2VydmljZQotTEFCRUxfREFUQUJJTkRJTkdfQ0FQVElPTj1EYXRhYmluZGluZwotTEFCRUxfUE9SVE5BTUU9UG9ydCBOYW1lCi1MQUJFTF9HRU5FUkFURV9BTEw9R2VuZXJhdGUgYWxsIHR5cGVzIGZvciBhbGwgZWxlbWVudHMgcmVmZXJyZWQgdG8gYnkgc2NoZW1hcwotTEFCRUxfUEFDS0VHRV9OQU1FPUN1c3RvbSBwYWNrYWdlIG5hbWUKLUxBQkVMX05BTUVTUEFDRT1OYW1lc3BhY2UKLUxBQkVMX1BBQ0tBR0U9UGFja2FnZQotTEFCRUxfQ0xJRU5UX1NJREU9Q2xpZW50IG1vZGUKLUxBQkVMX1NZTkNfQU5EX0FTWU5DPUdlbmVyYXRlIGEgY2xpZW50IHdoaWNoIHN1cHBvcnRzIGJvdGggc3luY2hyb25vdXMgYW5kIGFzeW5jaHJvbm91cyBpbnZvY2F0aW9uCi1MQUJFTF9TWU5DPUdlbmVyYXRlIGEgc3luY2hyb25vdXMgY2xpZW50Ci1MQUJFTF9BU1lOQz1HZW5lcmF0ZSBhbiBhc3luY2hyb25vdXMgY2xpZW50Ci0KLVBBR0VfVElUTEVfV1NfQVhJUzJfUFJPWFk9QXhpczIgQ2xpZW50IFdlYiBTZXJ2aWNlIENvbmZpZ3VyYXRpb24gCi1QQUdFX0RFU0NfV1NfQVhJUzJfUFJPWFk9U2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBjb2RlIGdlbmVyYXRpb24gc2V0dGluZ3MgCi0KLUVSUk9SX0lOVkFMSURfRklMRV9SRUFEX1dSSVRFTD1FeGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgcmVhZGluZyBvciB3cml0aW5nIGZpbGVzIHswfQotRVJST1JfSU5WQUxJRF9XU0RMX0ZJTEVfUkVBRF9XUklURUw9RXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHJlYWRpbmcgb3Igd3JpdGluZyBXU0RMIHswfQotRVJST1JfQ09ERUdFTl9FWENFUFRJT049RXhjZXB0aW9uIG9jY3VycmVkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gZm9yIFdTREwgezB9Ci1FUlJPUl9KVU5JVF9KQVJfTk9UX0ZPVU5EPUV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBjb3B5aW5nIGp1bml0LmphcgotRVJST1JfV1NETF9QSU5HX1RJTUVfT1VUPUNvdWxkIG5vdCByZXRyaWV2ZSB0aGUgV1NETC4gVGltZW91dCBvY2N1cnJlZC4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb25zdW1wdGlvbi9jb3JlL21lc3NhZ2VzL0F4aXMyQ29uc3VtcHRpb25VSU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29uc3VtcHRpb24vY29yZS9tZXNzYWdlcy9BeGlzMkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzNkMmVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb25zdW1wdGlvbi9jb3JlL21lc3NhZ2VzL0F4aXMyQ29uc3VtcHRpb25VSU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAxMTAgICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgQXhpczIgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSAqIDIwMDcwNDI2ICAgMTgzMDQ2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSAqIDIwMDcwNTExICAgMTg2NDQwIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGggZml4IDE4NjQ0MAotICogMjAwNzA1MTcgICAxODczMDcgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aAotICogMjAwNzA1MTggICAxODczMTEgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgRml4aW5nIHRlc3QgcmVzb3VyY2UgYWRkaXRpb24KLSAqIDIwMDcwNjAxICAgMTkwNTA1IHBtb29na0BjYS5pYm0uY29tIC0gUGV0ZXIgTW9vZ2sKLSAqIDIwMDcwODI0ICAgMjAwNTE1IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIE5PTi1OTFMgbW92ZSB0byBzZXBlcmF0ZSBmaWxlCi0gKiAyMDA4MDExNiAgICBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbnRyb2R1Y2VkIGZvciB0aGUgRml4IDIwOTQxMQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLm1lc3NhZ2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIEF4aXMyQ29uc3VtcHRpb25VSU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9IAotCQkib3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUubWVzc2FnZXMuQXhpczJDb25zdW1wdGlvblVJIjsvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBBeGlzMkNvbnN1bXB0aW9uVUlNZXNzYWdlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfU0VSVklDRV9OQU1FX0NBUFRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfR0VORVJBVEVfVEVTVENBU0VfQ0FQVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9EQVRBQklORElOR19DQVBUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX1BPUlROQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX0dFTkVSQVRFX0FMTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9QQUNLRUdFX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfTkFNRVNQQUNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX1BBQ0tBR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfQ0xJRU5UX1NJREU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfU1lOQ19BTkRfQVNZTkM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfU1lOQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9BU1lOQzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQQUdFX1RJVExFX1dTX0FYSVMyX1BST1hZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBBR0VfREVTQ19XU19BWElTMl9QUk9YWTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9JTlZBTElEX0ZJTEVfUkVBRF9XUklURUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfSU5WQUxJRF9XU0RMX0ZJTEVfUkVBRF9XUklURUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfQ09ERUdFTl9FWENFUFRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfSlVOSVRfSkFSX05PVF9GT1VORDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9XU0RMX1BJTkdfVElNRV9PVVQ7Ci0JCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQXhpczJDb25zdW1wdGlvblVJTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb25zdW1wdGlvbi9jb3JlL3BsdWdpbi9XZWJTZXJ2aWNlQXhpczJDb25zdW1wdGlvbkNvcmVQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb25zdW1wdGlvbi9jb3JlL3BsdWdpbi9XZWJTZXJ2aWNlQXhpczJDb25zdW1wdGlvbkNvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY5Y2JjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29uc3VtcHRpb24vY29yZS9wbHVnaW4vV2ViU2VydmljZUF4aXMyQ29uc3VtcHRpb25Db3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzA0MjYgICAxODMwNDYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLnBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZUF4aXMyQ29uc3VtcHRpb25Db3JlUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZSI7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgV2ViU2VydmljZUF4aXMyQ29uc3VtcHRpb25Db3JlUGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgV2ViU2VydmljZUF4aXMyQ29uc3VtcHRpb25Db3JlUGx1Z2luKCkgewotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgV2ViU2VydmljZUF4aXMyQ29uc3VtcHRpb25Db3JlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29uc3VtcHRpb24vY29yZS91dGlscy9Db250ZW50Q29weVV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29uc3VtcHRpb24vY29yZS91dGlscy9Db250ZW50Q29weVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZDlmNDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvbnN1bXB0aW9uL2NvcmUvdXRpbHMvQ29udGVudENvcHlVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDExOCAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotICogMjAwNzA0MjYgICAxODMwNDYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aAotICogMjAwODA2MTYgICAyMzczNjMgc2FtaW5kYXdAd3NvMi5jb20gLSBTYW1pbmRhIFdpamVyYXRuZSwgZ2V0IFJlc291cmNlQ29udGV4dCBmcm9tIGVudmlyb25tZW50IGluc3RlYWQgb2YgcHJlZmVyZW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLnV0aWxzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS5tZXNzYWdlcy5BeGlzMkNvbnN1bXB0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmVjbGlwc2UuQmFzZUVjbGlwc2VFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklTdGF0dXNIYW5kbGVyOwotCi1wdWJsaWMgY2xhc3MgQ29udGVudENvcHlVdGlscyB7Ci0KLQlwcml2YXRlIExpc3QgZmlsZUFuZERpcmVjdG9yaWVzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIElFbnZpcm9ubWVudCBlbnZpcm9ubWVudDsKLQlGaWxlSW5wdXRTdHJlYW0gZmluU3RyZWFtID0gbnVsbDsJCQotCi0JcHVibGljICBDb250ZW50Q29weVV0aWxzKElFbnZpcm9ubWVudCBlbnYpewotCQllbnZpcm9ubWVudD0gZW52IDsKLQl9Ci0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBjb3B5IHRoZSBzb3VyY2UgZGlyZWN0b3J5IGludG8gdGhlIGVjbGlwc2Ugd29ya3NwYWNlIGFjY29yZGluZyAKLQkgKiB0byB0aGUgRWNsaXBzZSBGcmFtZXdvcmsgQVBJCi0JICogQHBhcmFtIHNvdXJjZURpcgotCSAqIEBwYXJhbSBkZXN0aW5hdGlvbkRpcgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHBhcmFtIHN0YXR1c0hhbmRsZXIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElTdGF0dXMgY29weURpcmVjdG9yeVJlY3Vyc2l2ZWx5SW50b1dvcmtzcGFjZShTdHJpbmcgc291cmNlRGlyLCAKLQkJCQlTdHJpbmcgZGVzdGluYXRpb25EaXIsCi0JCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLAotCQkJCUlTdGF0dXNIYW5kbGVyIHN0YXR1c0hhbmRsZXIpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQlmaWxlQW5kRGlyZWN0b3JpZXNMaXN0LmNsZWFyKCk7Ci0JCUZpbGUgYXhpczJXZWJhcHBGb2xkZXIgPSBuZXcgRmlsZShzb3VyY2VEaXIpOwotCQl2aXNpdEFsbERpcnNBbmRGaWxlcyhheGlzMldlYmFwcEZvbGRlcik7Ci0JCUxpc3QgZGVwbG95RmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWRlcGxveUZpbGVzPSBmaWxlQW5kRGlyZWN0b3JpZXNMaXN0OwotCi0JCXRyeSB7Ci0KLQkJCS8vSW1wb3J0IHRoZSBheGlzMiBkZXBlbmRlbmN5IHBsdWdpbiBhY2NvcmRpbmcgdG8gdGhlIFJlc291cmNlcyBBUEkgb2YgZWNsaXBzZSAKLQkJCVJlc291cmNlQ29udGV4dCBjb250ZXh0OwotCQkJaWYgKGVudmlyb25tZW50PT1udWxsKQotCQkJCWNvbnRleHQgPSBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UmVzb3VyY2VDb250ZXh0KCk7Ci0JCQllbHNlCi0JCQkJY29udGV4dCA9ICgoQmFzZUVjbGlwc2VFbnZpcm9ubWVudCkgZW52aXJvbm1lbnQpLmdldFJlc291cmNlQ29udGV4dCgpOwkKLQkJCQotCQkJSVBhdGggb3V0cHV0UGF0aCA9IG5ldyBQYXRoIChkZXN0aW5hdGlvbkRpcik7Ci0KLQkJCVN0cmluZyBmaWxlTmFtZTsKLQkJCUlQYXRoIHRhcmdldFBhdGg9bnVsbDsKLQkJCWJvb2xlYW4gaXNEaXJlY3RvcnkgPSBmYWxzZTsKLQotCQkJU3RyaW5nIGRlcGxveUZpbGU7Ci0JCQlJdGVyYXRvciBpdGVyYXRvcjsKLQotCQkJU3RyaW5nIHRlbXBPdXRwdXREaXIgPSBheGlzMldlYmFwcEZvbGRlci50b1N0cmluZygpOwotCQkJaXRlcmF0b3IgPSBkZXBsb3lGaWxlcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCWRlcGxveUZpbGUgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJRmlsZSBzb3VyY2UgPSBuZXcgRmlsZShkZXBsb3lGaWxlKTsKLQkJCQlpZiAoc291cmNlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJaXNEaXJlY3RvcnkgPXRydWU7Ci0JCQkJfWVsc2V7Ci0JCQkJCWlzRGlyZWN0b3J5PWZhbHNlOwotCQkJCQlmaW5TdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNvdXJjZSk7Ci0JCQkJfQotCi0JCQkJaWYgKGRlcGxveUZpbGUuc3RhcnRzV2l0aCh0ZW1wT3V0cHV0RGlyKSkgewotCQkJCQlmaWxlTmFtZSA9IGRlcGxveUZpbGUuc3Vic3RyaW5nKHRlbXBPdXRwdXREaXIubGVuZ3RoKCkpOwotCQkJCQl0YXJnZXRQYXRoID0gb3V0cHV0UGF0aC5hcHBlbmQoZmlsZU5hbWUpLm1ha2VBYnNvbHV0ZSgpOwotCQkJCQlpZiAoaXNEaXJlY3RvcnkpewotCQkJCQkJb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbW1vbi5GaWxlUmVzb3VyY2VVdGlscwotCQkJCQkJLm1ha2VGb2xkZXJQYXRoQXRMb2NhdGlvbihjb250ZXh0LCAgCi0JCQkJCQkJCXRhcmdldFBhdGgsCi0JCQkJCQkJCW1vbml0b3IsCi0JCQkJCQkJCXN0YXR1c0hhbmRsZXIpOwotCQkJCQl9ZWxzZXsKLQkJCQkJCWlmIChmaW5TdHJlYW0gIT0gbnVsbCkgewotCQkJCQkJCW9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb21tb24uRmlsZVJlc291cmNlVXRpbHMKLQkJCQkJCQkuY3JlYXRlRmlsZUF0TG9jYXRpb24oY29udGV4dCwgIAotCQkJCQkJCQkJdGFyZ2V0UGF0aCwKLQkJCQkJCQkJCWZpblN0cmVhbSwKLQkJCQkJCQkJCW1vbml0b3IsCi0JCQkJCQkJCQlzdGF0dXNIYW5kbGVyKTsKLQkJCQkJCX0KLQkJCQkJCWZpblN0cmVhbS5jbG9zZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cygKLQkJCQkJTkxTLmJpbmQoQXhpczJDb25zdW1wdGlvblVJTWVzc2FnZXMuRVJST1JfSU5WQUxJRF9GSUxFX1JFQURfV1JJVEVMLAotCQkJCQkJCW5ldyBTdHJpbmdbXXtlLmdldExvY2FsaXplZE1lc3NhZ2UoKX0pLCBlKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cygKLQkJCQkJTkxTLmJpbmQoQXhpczJDb25zdW1wdGlvblVJTWVzc2FnZXMuRVJST1JfSU5WQUxJRF9GSUxFX1JFQURfV1JJVEVMLAotCQkJCQkJCW5ldyBTdHJpbmdbXXtlLmdldExvY2FsaXplZE1lc3NhZ2UoKX0pLCBlKTsKLQkJfQotCi0JCXJldHVybiBzdGF0dXM7Ci0KLQl9Ci0KLQkvLwlQcm9jZXNzIGFsbCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgdW5kZXIgZGlyCi0JcHJpdmF0ZSB2b2lkIHZpc2l0QWxsRGlyc0FuZEZpbGVzKEZpbGUgZGlyKSB7Ci0KLQkJZmlsZUFuZERpcmVjdG9yaWVzTGlzdC5hZGQoZGlyLmdldEFic29sdXRlUGF0aCgpKTsKLQotCQlpZiAoZGlyLmlzRGlyZWN0b3J5KCkpIHsKLQkJCVN0cmluZ1tdIGNoaWxkcmVuID0gZGlyLmxpc3QoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCXZpc2l0QWxsRGlyc0FuZEZpbGVzKG5ldyBGaWxlKGRpciwgY2hpbGRyZW5baV0pKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvbnN1bXB0aW9uL2NvcmUvdXRpbHMvRGVmYXVsdENvZGVnZW5VdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29uc3VtcHRpb24vY29yZS91dGlscy9EZWZhdWx0Q29kZWdlblV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZhNTJiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29uc3VtcHRpb24vY29yZS91dGlscy9EZWZhdWx0Q29kZWdlblV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDIwNiAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiAKLSAqIAkJCQkJCQkJCQkgIHJ1bnRpbWUgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzYyCi0gKiAyMDA3MDQyNiAgIDE4MzA0NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKiAyMDA4MDYyMSAgIDIwMDA2OSBzYW1pbmRhd0B3c28yLmNvbSAtIFNhbWluZGEgV2lqZXJhdG5lLCBzYXZpbmcgdGhlIHJldHJpZXZlZCBXU0RMIHNvIG5vIG5lZWQgdG8gcmV0cmlldmUgaXQgYWdhaW4KLSAqIDIwMDkxMjA3ICAgMTkzOTk2IHNhbWluZGF3QHdzbzIuY29tIC0gU2FtaW5kYSBXaWplcmF0bmUsIHNlbGVjdGluZyBhIHNwZWNpZmljIHNlcnZpY2UvcG9ydG5hbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS51dGlsczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLmRhdGEuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUubWVzc2FnZXMuQXhpczJDb25zdW1wdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUudXRpbHMuQ2xhc3NMb2FkaW5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNVdGlsczsKLQotcHVibGljIGNsYXNzIERlZmF1bHRDb2RlZ2VuVXRpbCB7Ci0JCi0JcHJpdmF0ZSBXU0RMUHJvcGVydHlSZWFkZXIgcmVhZGVyOwotCXByaXZhdGUgTW9kZWwgbW9kZWw7Ci0JcHJpdmF0ZSBMaXN0IHNlcnZpY2VRTmFtZUxpc3QgPSBudWxsOwotCUlTdGF0dXMgc3RhdHVzOwotCQotCXB1YmxpYyBEZWZhdWx0Q29kZWdlblV0aWwob3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUuZGF0YS5EYXRhTW9kZWwgbW9kZWwpewotCQl0aGlzLm1vZGVsPW1vZGVsOwotCX0KLQkKLQlwdWJsaWMgRGVmYXVsdENvZGVnZW5VdGlsKG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLmRhdGEuRGF0YU1vZGVsIG1vZGVsKXsKLQkJdGhpcy5tb2RlbD1tb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBwb3B1bGF0ZSB0aGUgbW9kZWwgZm9yIHRoZSBkZWZhdWx0IHNjZW5hcmlvIGZyb20gdGhlIHdzZGwgdXJsCi0JICovCi0JcHVibGljIHZvaWQgcG9wdWxhdGVNb2RlbFBhcmFtc0Zyb21XU0RMKCkgewotCQlzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQlpZiAocmVhZGVyID09IG51bGwpCi0JCQlyZWFkZXIgPSBuZXcgV1NETFByb3BlcnR5UmVhZGVyKG1vZGVsKTsKLQkJdHJ5IHsKLQkJCVN0cmluZyBsbmFtZSA9IG1vZGVsLmdldFdzZGxVUkkoKTsKLQkJCWlmICghIiIuZXF1YWxzKGxuYW1lLnRyaW0oKSkpIHsKLQotCQkJCXJlYWRlci5yZWFkV1NETChtb2RlbC5nZXRXZWJQcm9qZWN0TmFtZSgpLCBsbmFtZSk7Ci0KLQkJCQl0aGlzLnNlcnZpY2VRTmFtZUxpc3QgPSByZWFkZXIuZ2V0U2VydmljZUxpc3QoKTsKLQkJCQlpZiAoIXNlcnZpY2VRTmFtZUxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCS8vIGFkZCB0aGUgbG9jYWwgcGFydCBvZiB0aGUKLQkJCQkJT2JqZWN0IHNlcnZpY2VRbmFtZUluc3RhbmNlID0gc2VydmljZVFOYW1lTGlzdC5nZXQoMCk7Ci0vLwkJCQkJQ2xhc3MgUU5hbWVDbGFzcyA9IENsYXNzTG9hZGluZ1V0aWwKLS8vCQkJCQkJCS5sb2FkQ2xhc3NGcm9tQW50Q2xhc3NMb2FkZXIoImphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUiKTsKLS8vCQkJCQlNZXRob2QgR2V0TG9jYWxQYXJ0TWV0aG9kICA9IFFOYW1lQ2xhc3MuZ2V0TWV0aG9kKCJnZXRMb2NhbFBhcnQiLCBudWxsKTsKLS8vCQkJCQlPYmplY3QgcmVzdWx0TG9jYWxQYXJ0ID0gR2V0TG9jYWxQYXJ0TWV0aG9kLmludm9rZShzZXJ2aWNlUW5hbWVJbnN0YW5jZSwgbnVsbCk7Ci0JCQkJCW1vZGVsLnNldFNlcnZpY2VRTmFtZShzZXJ2aWNlUW5hbWVJbnN0YW5jZSk7Ci0JCQkJCS8vIGxvYWQgdGhlIHBvcnRzCi0JCQkJCSBsb2FkUG9ydE5hbWVzKCk7Ci0JCQkJfSAKLQkJCQlwb3B1bGF0ZVBhY2thZ2VOYW1lKCk7Ci0JCQkJLy9wb3B1bGF0ZSB0aGUgbmFtZXNwYWNlc3MKLQkJCQkvL2xvYWROYW1lc3BhY2VzKHJlYWRlci5nZXREZWZpbml0aW9uTmFtZXNwYWNlTWFwKCkpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJc3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoTkxTLmJpbmQoCi0JCQkJCUF4aXMyQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkVSUk9SX0lOVkFMSURfV1NETF9GSUxFX1JFQURfV1JJVEVMLAotCQkJCQluZXcgU3RyaW5nW117ZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCl9KSwgZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvYWRQb3J0TmFtZXMoKSB7Ci0JCQlqYXZhLnV0aWwuTGlzdCBwb3J0cyA9IHJlYWRlci5nZXRQb3J0TmFtZUxpc3Qoc2VydmljZVFOYW1lTGlzdC5nZXQoMCkpOwotCQkJCQkvLyBhZGQgdGhlIGxvY2FsIHBhcnQgb2YgdGhlCi0JCQkJCW1vZGVsLnNldFBvcnROYW1lKHBvcnRzLmdldCgwKS50b1N0cmluZygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlUGFja2FnZU5hbWUoKSB7Ci0JCW1vZGVsLnNldFBhY2thZ2VUZXh0KHJlYWRlci5wYWNrYWdlRnJvbVRhcmdldE5hbWVzcGFjZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb25zdW1wdGlvbi9jb3JlL3V0aWxzL1NlcnZpY2VQaW5nVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvbnN1bXB0aW9uL2NvcmUvdXRpbHMvU2VydmljZVBpbmdVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MmI1OTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvbnN1bXB0aW9uL2NvcmUvdXRpbHMvU2VydmljZVBpbmdVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwODAxMTYgICAgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW50cm9kdWNlZCBmb3IgdGhlIEZpeCAyMDk0MTEKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwgcmV0cmlldmFsIGlzc3VlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUudXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUubWVzc2FnZXMuQXhpczJDb25zdW1wdGlvblVJTWVzc2FnZXM7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgdGhlIHNlcnZpY2UgcGluZwotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZVBpbmdVdGlsIHsKLQkvKioKLQkgKiBXU0RMIFJldHJpZXZlIFRpbWVvdXQKLQkgKi8KLQlpbnQgdGltZVRPUmV0cmlldmVXU0RMID0gMTAwMDAgOyAvLyBEZWZhdWx0IGlzIDEwIHNlYyAKLQkKLQkvKioKLQkgKiBVdGlsaXR5IG1ldGhvZCB0byBjb25uZWN0IHRvIGEgcGFydGljdWxhciBVUkwKLQkgKiBAcGFyYW0gdXJsCi0JICovCi0JcHVibGljIHZvaWQgY29ubmVjdFRvVVJMKFN0cmluZyB1cmxTdHJpbmcpIHRocm93cyBFeGNlcHRpb257Ci0JCVVSTCB1cmwgPSBuZXcgVVJMKHVybFN0cmluZyk7Ci0gICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgVVJMQ29ubmVjdGlvbiB1cmxDb247Ci0gICAgICAgICAgICAgICAgdXJsQ29uID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyBoYW5kbGUgdGhlIEhUVFBTIHNjZW5hcmlvIGFzIHdlbGwuIAotICAgICAgICAgICAgICAgIGlmICh1cmxDb24gaW5zdGFuY2VvZiBIdHRwVVJMQ29ubmVjdGlvbikgewotICAgICAgICAgICAgICAgIAlIdHRwVVJMQ29ubmVjdGlvbiBodHRwQ29uID0gKEh0dHBVUkxDb25uZWN0aW9uKXVybENvbjsKLSAgICAgICAgICAgICAgICAgICAgaHR0cENvbi5zZXREb091dHB1dCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgaHR0cENvbi5zZXREb0lucHV0KHRydWUpOwotICAgICAgICAgICAgICAgICAgICBodHRwQ29uLnNldFVzZUNhY2hlcyhmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGh0dHBDb24uc2V0UmVxdWVzdE1ldGhvZCgiR0VUIik7Ci0gICAgICAgICAgICAgICAgICAgIEh0dHBVUkxDb25uZWN0aW9uLnNldEZvbGxvd1JlZGlyZWN0cyh0cnVlKTsgIAotICAgICAgICAgICAgICAgICAgICBodHRwQ29uLnNldFJlYWRUaW1lb3V0KHRpbWVUT1JldHJpZXZlV1NETCk7Ci0gICAgICAgICAgICAgICAgICAgIGh0dHBDb24uY29ubmVjdCgpOyAgLy8gdHJ5IHRvIGNvbm5lY3QgdG8gV1NETAotICAgICAgICAgICAgICAgICAgICBodHRwQ29uLmRpc2Nvbm5lY3QoKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBEbyBub3RoaW5nIAotCQkJCQkvLyBBc3N1bWUgdGhhdCB0aGlzIGlzIGluIHRoZSBsb2NhbCBmaWxlIHN5c3RlbQotCQkJCX0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBpZihTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0ID49IHRpbWVUT1JldHJpZXZlV1NETCl7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihBeGlzMkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5FUlJPUl9XU0RMX1BJTkdfVElNRV9PVVQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIFdTREwgcmVhZCB0aW1lb3V0IAotCSAqIEBwYXJhbSB0aW1lVE9SZXRyaWV2ZVdTREwgCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGltZVRPUmV0cmlldmVXU0RMKGludCB0aW1lVE9SZXRyaWV2ZVdTREwpIHsKLQkJdGhpcy50aW1lVE9SZXRyaWV2ZVdTREwgPSB0aW1lVE9SZXRyaWV2ZVdTREw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29uc3VtcHRpb24vY29yZS91dGlscy9XU0RMMkphdmFHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb25zdW1wdGlvbi9jb3JlL3V0aWxzL1dTREwySmF2YUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTY5ODVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb25zdW1wdGlvbi9jb3JlL3V0aWxzL1dTREwySmF2YUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDExOCAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiAKLSAqIAkJCQkJCQkJCQkgIHJ1bnRpbWUgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzYyCi0gKiAyMDA3MDQyNiAgIDE4MzA0NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKiAyMDA3MDUwNyAgIDE4NDcyOSBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKiAyMDA4MDkyNCAgIDI0NzkyOSBzYW1pbmRhd0B3c28yLmNvbSAtIFNhbWluZGEgV2lqZXJhdG5lLCBzb3VyY2UgZm9sZGVyIG5vdCBjb3JyZWN0bHkgc2V0Ci0gKiAyMDA5MTIwNyAgIDE5Mzk5NiBzYW1pbmRhd0B3c28yLmNvbSAtIFNhbWluZGEgV2lqZXJhdG5lLCBzZWxlY3RpbmcgYSBzcGVjaWZpYyBzZXJ2aWNlL3BvcnRuYW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUudXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUudXRpbHMuQ2xhc3NMb2FkaW5nVXRpbDsKLQotcHVibGljIGNsYXNzIFdTREwySmF2YUdlbmVyYXRvciB7Ci0JCi0gICAgLyoqCi0gICAgICogTWFwcyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lIG9mIGEgbGFuZ3VhZ2UgdG8gYSBjb25zdGFudCBkZWZpbmVkIGluIAotICAgICAqIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLkxhbmd1YWdlTmFtZXMKLSAgICAgKiBAcGFyYW0gVUlMYW5nVmFsdWUgYSBzdHJpbmcgY29udGFpbmcgYSBsYW5ndWFnZSwgZS5nLiAiamF2YSIsICJjcyIsICJjcHAiIG9yICJ2YiIKLSAgICAgKiBAcmV0dXJuIGEgbm9ybWFsaXplZCBzdHJpbmcgY29uc3RhbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtYXBMYW5ndWFnZXNXaXRoQ29tYm8oU3RyaW5nIFVJTGFuZ1ZhbHVlKSAgewotICAgICAgIHJldHVybiBVSUxhbmdWYWx1ZTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGxpc3Qgb2YgcGFyYW1ldGVycyBmb3IgdGhlIGNvZGUgZ2VuZXJhdG9yIGJhc2VkIG9uIHRoZSBkZWNpc2lvbnMgbWFkZSBieSAKLSAgICAgKiB0aGUgdXNlciBvbiB0aGUgT3B0aW9uc1BhZ2UocGFnZTIpLiBGb3IgZWFjaCBzZXR0aW5nLCB0aGVyZSBpcyBhIENvbW1hbmQtTGluZSBvcHRpb24gZm9yIAotICAgICAqIHRoZSBBeGlzMiBjb2RlIGdlbmVyYXRvci4KLSAgICAgKiBAcmV0dXJuIGEgTWFwIHdpdGgga2V5cyBmcm9tIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzIHdpdGggdGhlIHZhbHVlcyBlbnRlcmVkIAotICAgICAqIGJ5IHRoZSB1c2VyIG9uIHRoZSBPcHRpb25zIFBhZ2UuCi0gICAgICovCi0gICAgcHVibGljIE1hcCBmaWxsT3B0aW9uTWFwKGJvb2xlYW4gaXNBeW5jT25seSwKLSAgICAgICAgICAgIAkJICBib29sZWFuIGlzU3luY09ubHksCi0gICAgICAgICAgICAJCSAgYm9vbGVhbiBpc1NlcnZlclNpZGUsCi0gICAgICAgICAgICAJCSAgYm9vbGVhbiBpc1NlcnZlclhNTCwKLSAgICAgICAgICAgIAkJICBib29sZWFuIGlzVGVzdENhc2UsCi0gICAgICAgICAgICAJCSAgYm9vbGVhbiBpc0dlbmVyYXRlQWxsLAotICAgICAgICAgICAgCQkgIFN0cmluZyBzZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgIAkJICBTdHJpbmcgcG9ydE5hbWUsCi0gICAgICAgICAgICAJCSAgU3RyaW5nIGRhdGFiaW5kaW5nTmFtZSwKLSAgICAgICAgICAgIAkJICBTdHJpbmcgV1NETFVSSSwKLSAgICAgICAgICAgIAkJICBTdHJpbmcgcGFja2FnZU5hbWUsCi0gICAgICAgICAgICAJCSAgU3RyaW5nIHNlbGVjdGVkTGFuZ3VhZ2UsCi0gICAgICAgICAgICAJCSAgU3RyaW5nIG91dHB1dExvY2F0aW9uLAotICAgICAgICAgICAgCQkgIFN0cmluZyBzb3VyY2VGb2xkZXIsCi0gICAgICAgICAgICAJCSAgU3RyaW5nIG5hbWVzcGFjZTJwYWNrYWdlTGlzdCwKLSAgICAgICAgICAgIAkJICBib29sZWFuIGlzU2VydmVyU2lkZUludGVyZmFjZQotICAgICAgICAgICAgCQkgICl7Ci0gICAgICAgTWFwIG9wdGlvbk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgCi0gICAgIHRyeXsgIAotICAgICAgICAvL1JlZmxlY3Rpb24gaW52b2NhdGluIHJlc291cmNlcwotCQlDbGFzcyBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50c0NsYXNzID0gQ2xhc3NMb2FkaW5nVXRpbC5sb2FkQ2xhc3NGcm9tQW50Q2xhc3NMb2FkZXIoCi0JCQkJCQkJIm9yZy5hcGFjaGUuYXhpczIudXRpbC5Db21tYW5kTGluZU9wdGlvbkNvbnN0YW50cyRXU0RMMkphdmFDb25zdGFudHMiKTsKLQkJQ2xhc3MgQ29tbWFuZExpbmVPcHRpb25DbGFzcyA9IENsYXNzTG9hZGluZ1V0aWwubG9hZENsYXNzRnJvbUFudENsYXNzTG9hZGVyKAotCQkJCQkJCQkJCQkJCQkib3JnLmFwYWNoZS5heGlzMi51dGlsLkNvbW1hbmRMaW5lT3B0aW9uIik7Ci0JCUNvbnN0cnVjdG9yIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RydWN0b3IgPSBDb21tYW5kTGluZU9wdGlvbkNsYXNzLmdldENvbnN0cnVjdG9yKAotCQkJCQkJCQkJCQkJCQluZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3MsU3RyaW5nW10uY2xhc3N9KTsKLSAgICAgICAgLy9XU0RMIGZpbGUgbmFtZQotICAgICAgIAotCQkJCQkJCS8vICAgICAgIG9wdGlvbk1hcC5wdXQoQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLldTRExfTE9DQVRJT05fVVJJX09QVElPTiwgCi0JCQkJCQkJLy8gICAgCQkgICAJCSBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0JCQkJCQkJLy8gICAgCQkgICAJCQkJIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5XU0RMX0xPQ0FUSU9OX1VSSV9PUFRJT04sCi0JCQkJCQkJLy8gICAgCQkgICAJCQkJIGdldFN0cmluZ0FycmF5KFdTRExVUkkpKSk7Ci0JCQotICAgICAgICAvL1JlZmxlY3Rpb24gSW52b2NhdGlvbiAKLQkJRmllbGQgV1NETF9MT0NBVElPTl9VUklfT1BUSU9OX0ZJRUxEID0gQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHNDbGFzcy5nZXRGaWVsZCgKLQkJCQkJCQkJCQkJCQkJCQkJCSJXU0RMX0xPQ0FUSU9OX1VSSV9PUFRJT04iKTsKLQkJb3B0aW9uTWFwLnB1dCgoU3RyaW5nKVdTRExfTE9DQVRJT05fVVJJX09QVElPTl9GSUVMRC5nZXQoU3RyaW5nLmNsYXNzKSwKLQkJCQkJCUNvbW1hbmRMaW5lT3B0aW9uQ29uc3RydWN0b3IubmV3SW5zdGFuY2UoCi0JCQkJCQkJbmV3IE9iamVjdFtdeyhTdHJpbmcpV1NETF9MT0NBVElPTl9VUklfT1BUSU9OX0ZJRUxELmdldChTdHJpbmcuY2xhc3MpLAotCQkJCQkJCWdldFN0cmluZ0FycmF5KFdTRExVUkkpfSkpOwotICAgICAgIAotICAgICAgIC8vQXN5bmMgb25seQotICAgICAgIGlmIChpc0F5bmNPbmx5KQotICAgICAgIHsKLQkJCQkJCQkvLyAgICAgICAgICBvcHRpb25NYXAucHV0KENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5DT0RFR0VOX0FTWU5DX09OTFlfT1BUSU9OLCAKLQkJCQkJCQkvLyAgICAgICAgCQkgIAluZXcgQ29tbWFuZExpbmVPcHRpb24oCi0JCQkJCQkJLy8gICAgICAgIAkJICAJCQlDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuQ09ERUdFTl9BU1lOQ19PTkxZX09QVElPTiwKLQkJCQkJCQkvLyAgICAgICAgCQkgIAkJCW5ldyBTdHJpbmdbMF0pKTsKLSAgICAgICAgCi0gICAgCS8vUmVmbGVjdGlvbiBJbnZvY2F0aW9uICAgICAJICAgCi0gICAJCUZpZWxkIENPREVHRU5fQVNZTkNfT05MWV9PUFRJT05fRklFTEQgPSBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50c0NsYXNzCi0gICAJCQkJCQkJCQkJCQkuZ2V0RmllbGQoIkNPREVHRU5fQVNZTkNfT05MWV9PUFRJT04iKTsKLQkJb3B0aW9uTWFwLnB1dCgoU3RyaW5nKUNPREVHRU5fQVNZTkNfT05MWV9PUFRJT05fRklFTEQuZ2V0KAotCQkJCQkJU3RyaW5nLmNsYXNzKSwKLQkJCQkJCUNvbW1hbmRMaW5lT3B0aW9uQ29uc3RydWN0b3IubmV3SW5zdGFuY2UoCi0JCQkJCQkJbmV3IE9iamVjdFtdeyhTdHJpbmcpQ09ERUdFTl9BU1lOQ19PTkxZX09QVElPTl9GSUVMRC5nZXQoU3RyaW5nLmNsYXNzKSwKLQkJCQkJCQluZXcgU3RyaW5nWzBdfSkpOwotICAgICAgIH0KLSAgICAgICAKLSAgICAgICAvL3N5bmMgb25seQotICAgICAgIGlmIChpc1N5bmNPbmx5KQotICAgICAgIHsKLQkJCQkJCQkvLyAgICAgICAgICBvcHRpb25NYXAucHV0KENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5DT0RFR0VOX1NZTkNfT05MWV9PUFRJT04sIAotCQkJCQkJCS8vICAgICAgICAJCSAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotCQkJCQkJCS8vICAgICAgICAJCSAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkNPREVHRU5fU1lOQ19PTkxZX09QVElPTiwKLQkJCQkJCQkvLyAgICAgICAgCQkgIG5ldyBTdHJpbmdbMF0pKTsKLSAgICAgICAvL1JlZmxlY3Rpb24gSW52b2NhdGlvbgotICAgICAgCQlGaWVsZCBDT0RFR0VOX1NZTkNfT05MWV9PUFRJT05fRklFTEQgPSBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50c0NsYXNzCi0gICAgICAJCQkJCQkJCQkJCQkuZ2V0RmllbGQoIkNPREVHRU5fU1lOQ19PTkxZX09QVElPTiIpOwotICAgIAkJb3B0aW9uTWFwLnB1dCgoU3RyaW5nKUNPREVHRU5fU1lOQ19PTkxZX09QVElPTl9GSUVMRC5nZXQoU3RyaW5nLmNsYXNzKSwKLQkJCQkJQ29tbWFuZExpbmVPcHRpb25Db25zdHJ1Y3Rvci5uZXdJbnN0YW5jZSgKLQkJCQkJCQluZXcgT2JqZWN0W117KFN0cmluZylDT0RFR0VOX1NZTkNfT05MWV9PUFRJT05fRklFTEQuZ2V0KFN0cmluZy5jbGFzcyksCi0JCQkJCQkJbmV3IFN0cmluZ1swXX0pKTsKLSAgICAgICB9Ci0gICAgICAgLy9zZXJ2ZXJzaWRlCi0gICAgICAgaWYgKGlzU2VydmVyU2lkZSkKLSAgICAgICB7Ci0JCQkJCQkJLy8gICAgICAgICAgb3B0aW9uTWFwLnB1dChDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuU0VSVkVSX1NJREVfQ09ERV9PUFRJT04sIAotCQkJCQkJCS8vICAgICAgICAJCSAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotCQkJCQkJCS8vICAgICAgICAJCSAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlNFUlZFUl9TSURFX0NPREVfT1BUSU9OLAotCQkJCQkJCS8vICAgICAgICAJCSAgbmV3IFN0cmluZ1swXSkpOwotCSAgICAvL1JlZmxlY3Rpb24gSW52b2NhdGlvbgotCQlGaWVsZCBTRVJWRVJfU0lERV9DT0RFX09QVElPTl9GSUVMRCA9IENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzQ2xhc3MKLQkJCQkJCQkJCQkJCS5nZXRGaWVsZCgiU0VSVkVSX1NJREVfQ09ERV9PUFRJT04iKTsKLQkJb3B0aW9uTWFwLnB1dCgoU3RyaW5nKVNFUlZFUl9TSURFX0NPREVfT1BUSU9OX0ZJRUxELmdldChTdHJpbmcuY2xhc3MpLAotCQkJCUNvbW1hbmRMaW5lT3B0aW9uQ29uc3RydWN0b3IubmV3SW5zdGFuY2UoCi0JCQkJCQluZXcgT2JqZWN0W117KFN0cmluZylTRVJWRVJfU0lERV9DT0RFX09QVElPTl9GSUVMRC5nZXQoU3RyaW5nLmNsYXNzKSwKLQkJCQkJCW5ldyBTdHJpbmdbMF19KSk7Ci0gICAgICAgICAgLy9zZXJ2ZXIgeG1sCi0gICAgICAgICAgaWYgKGlzU2VydmVyWE1MKQotICAgICAgICAgIHsKLSAgICAgICAgICAvL29wdGlvbk1hcC5wdXQoCi0JCQkJCQkJLy8gICAgICAgICAgICAJCSBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuR0VORVJBVEVfU0VSVklDRV9ERVNDUklQVElPTl9PUFRJT04sCi0gICAgICAgICAgLy8gCW5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAvLyAJQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkdFTkVSQVRFX1NFUlZJQ0VfREVTQ1JJUFRJT05fT1BUSU9OLAotCQkJCQkJCS8vICAgICAgICAgICAgCQkgbmV3IFN0cmluZ1swXSkpOwotICAgICAgIAkJRmllbGQgR0VORVJBVEVfU0VSVklDRV9ERVNDUklQVElPTl9PUFRJT05fRklFTEQgPSBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50c0NsYXNzCi0gICAJCQkJCQkJCQkJCQkuZ2V0RmllbGQoIkdFTkVSQVRFX1NFUlZJQ0VfREVTQ1JJUFRJT05fT1BUSU9OIik7Ci0gICAgCQlvcHRpb25NYXAucHV0KChTdHJpbmcpR0VORVJBVEVfU0VSVklDRV9ERVNDUklQVElPTl9PUFRJT05fRklFTEQuZ2V0KFN0cmluZy5jbGFzcyksCi0JCQkJQ29tbWFuZExpbmVPcHRpb25Db25zdHJ1Y3Rvci5uZXdJbnN0YW5jZSgKLQkJCQkgICBuZXcgT2JqZWN0W117KFN0cmluZylHRU5FUkFURV9TRVJWSUNFX0RFU0NSSVBUSU9OX09QVElPTl9GSUVMRC5nZXQoU3RyaW5nLmNsYXNzKSwKLQkJCQkgICBuZXcgU3RyaW5nWzBdfSkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoaXNHZW5lcmF0ZUFsbCl7Ci0JCQkJCQkJLy8gICAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkdFTkVSQVRFX0FMTF9PUFRJT04sIAotCQkJCQkJCS8vICAgICAgICAgICAgCQkgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLQkJCQkJCQkvLyAgICAgICAgICAgIAkJICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuR0VORVJBVEVfQUxMX09QVElPTiwKLQkJCQkJCQkvLyAgICAgICAgICAgIAkJICBuZXcgU3RyaW5nWzBdKSk7Ci0JCQlGaWVsZCBHRU5FUkFURV9BTExfT1BUSU9OX0ZJRUxEID0gQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHNDbGFzcwotCQkJCQkJCQkJCQkJCQkuZ2V0RmllbGQoIkdFTkVSQVRFX0FMTF9PUFRJT04iKTsKLQkJCW9wdGlvbk1hcC5wdXQoKFN0cmluZylHRU5FUkFURV9BTExfT1BUSU9OX0ZJRUxELmdldChTdHJpbmcuY2xhc3MpLAotCQkJCQlDb21tYW5kTGluZU9wdGlvbkNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKAotCQkJCQkJCW5ldyBPYmplY3RbXXsoU3RyaW5nKUdFTkVSQVRFX0FMTF9PUFRJT05fRklFTEQuZ2V0KFN0cmluZy5jbGFzcyksCi0JCQkJCQkJbmV3IFN0cmluZ1swXX0pKTsKLSAgICAgICAgICB9Ci0gICAgICAgfQotICAgICAgIC8vdGVzdCBjYXNlCi0gICAgICAgaWYgKGlzVGVzdENhc2UpCi0gICAgICAgewotCQkJCQkJCS8vICAgICAgICAgIG9wdGlvbk1hcC5wdXQoQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkdFTkVSQVRFX1RFU1RfQ0FTRV9PUFRJT04sCi0JCQkJCQkJLy8gICAgICAgIAkJICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0JCQkJCQkJLy8gICAgICAgIAkJICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuR0VORVJBVEVfVEVTVF9DQVNFX09QVElPTiwKLQkJCQkJCQkvLyAgICAgICAgCQkgIG5ldyBTdHJpbmdbMF0pKTsKLQkJRmllbGQgR0VORVJBVEVfVEVTVF9DQVNFX09QVElPTl9GSUVMRCA9IENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzQ2xhc3MKLQkJCQkJCQkJCQkJCQkuZ2V0RmllbGQoIkdFTkVSQVRFX1RFU1RfQ0FTRV9PUFRJT04iKTsKLQkJb3B0aW9uTWFwLnB1dCgoU3RyaW5nKUdFTkVSQVRFX1RFU1RfQ0FTRV9PUFRJT05fRklFTEQuZ2V0KFN0cmluZy5jbGFzcyksCi0JCQkJQ29tbWFuZExpbmVPcHRpb25Db25zdHJ1Y3Rvci5uZXdJbnN0YW5jZSgKLQkJCQkJCW5ldyBPYmplY3RbXXsoU3RyaW5nKUdFTkVSQVRFX1RFU1RfQ0FTRV9PUFRJT05fRklFTEQuZ2V0KFN0cmluZy5jbGFzcyksCi0JCQkJCQluZXcgU3RyaW5nWzBdfSkpOwotICAgICAgIH0KLSAgICAgICAvL3BhY2thZ2UgbmFtZQotCQkJCQkJCS8vICAgICAgIG9wdGlvbk1hcC5wdXQoQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlBBQ0tBR0VfT1BUSU9OLAotCQkJCQkJCS8vICAgIAkJICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotCQkJCQkJCS8vICAgIAkJICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlBBQ0tBR0VfT1BUSU9OLAotCQkJCQkJCS8vICAgIAkJICAgZ2V0U3RyaW5nQXJyYXkocGFja2FnZU5hbWUpKSk7Ci0gCQlGaWVsZCBQQUNLQUdFX09QVElPTl9GSUVMRCA9IENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzQ2xhc3MuZ2V0RmllbGQoIlBBQ0tBR0VfT1BUSU9OIik7Ci0JCW9wdGlvbk1hcC5wdXQoKFN0cmluZylQQUNLQUdFX09QVElPTl9GSUVMRC5nZXQoU3RyaW5nLmNsYXNzKSwKLQkJCQkJCQlDb21tYW5kTGluZU9wdGlvbkNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKAotCQkJCQkJCQkJbmV3IE9iamVjdFtdeyhTdHJpbmcpUEFDS0FHRV9PUFRJT05fRklFTEQuZ2V0KFN0cmluZy5jbGFzcyksCi0JCQkJCQkJCQlnZXRTdHJpbmdBcnJheShwYWNrYWdlTmFtZSl9KSk7Ci0JCQotICAgICAgIC8vc2VsZWN0ZWQgbGFuZ3VhZ2UKLQkJCQkJCQkvLyAgICAgICBvcHRpb25NYXAucHV0KENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TVFVCX0xBTkdVQUdFX09QVElPTiwKLQkJCQkJCQkvLyAgICAJCSAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLQkJCQkJCQkvLyAgICAJCSAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TVFVCX0xBTkdVQUdFX09QVElPTiwKLQkJCQkJCQkvLyAgICAJCSAgIGdldFN0cmluZ0FycmF5KG1hcExhbmd1YWdlc1dpdGhDb21ibyhzZWxlY3RlZExhbmd1YWdlKSkpKTsKLSAJCUZpZWxkIFNUVUJfTEFOR1VBR0VfT1BUSU9OX0ZJRUxEID0gQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHNDbGFzcwotIAkJCQkJCQkJCQkJCQkJCS5nZXRGaWVsZCgiU1RVQl9MQU5HVUFHRV9PUFRJT04iKTsKLQkJb3B0aW9uTWFwLnB1dCgoU3RyaW5nKVNUVUJfTEFOR1VBR0VfT1BUSU9OX0ZJRUxELmdldChTdHJpbmcuY2xhc3MpLAotCQkJCQkJCUNvbW1hbmRMaW5lT3B0aW9uQ29uc3RydWN0b3IubmV3SW5zdGFuY2UoCi0JCQkJCQkJCW5ldyBPYmplY3RbXXsoU3RyaW5nKVNUVUJfTEFOR1VBR0VfT1BUSU9OX0ZJRUxELmdldChTdHJpbmcuY2xhc3MpLAotCQkJCQkJCQlnZXRTdHJpbmdBcnJheShtYXBMYW5ndWFnZXNXaXRoQ29tYm8oc2VsZWN0ZWRMYW5ndWFnZSkpfSkpOwotCQkKLSAgICAgICAvL291dHB1dCBsb2NhdGlvbgotCQkJCQkJCS8vICAgICAgIG9wdGlvbk1hcC5wdXQoQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLk9VVFBVVF9MT0NBVElPTl9PUFRJT04sCi0JCQkJCQkJLy8gICAgCQkgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0JCQkJCQkJLy8gICAgCQkgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuT1VUUFVUX0xPQ0FUSU9OX09QVElPTiwKLQkJCQkJCQkvLyAgICAJCSAgIGdldFN0cmluZ0FycmF5KG91dHB1dExvY2F0aW9uKSkpOwotIAkJRmllbGQgT1VUUFVUX0xPQ0FUSU9OX09QVElPTl9GSUVMRCA9IENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzQ2xhc3MKLSAJCQkJCQkJCQkJCQkJCS5nZXRGaWVsZCgiT1VUUFVUX0xPQ0FUSU9OX09QVElPTiIpOwotCQlvcHRpb25NYXAucHV0KChTdHJpbmcpT1VUUFVUX0xPQ0FUSU9OX09QVElPTl9GSUVMRC5nZXQoU3RyaW5nLmNsYXNzKSwKLQkJCQkJCQlDb21tYW5kTGluZU9wdGlvbkNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKAotCQkJCQkJCQluZXcgT2JqZWN0W117KFN0cmluZylPVVRQVVRfTE9DQVRJT05fT1BUSU9OX0ZJRUxELmdldChTdHJpbmcuY2xhc3MpLAotCQkJCQkJCQlnZXRTdHJpbmdBcnJheShvdXRwdXRMb2NhdGlvbil9KSk7Ci0gICAgICAgCi0gICAgICAvL2RhdGFiaW5kaW5nCi0JCQkJCQkJLy8gICAgICAgb3B0aW9uTWFwLnB1dChDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuREFUQV9CSU5ESU5HX1RZUEVfT1BUSU9OLAotCQkJCQkJCS8vICAgIAkJICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotCQkJCQkJCS8vICAgIAkJICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkRBVEFfQklORElOR19UWVBFX09QVElPTiwKLQkJCQkJCQkvLyAgICAJCSAgIGdldFN0cmluZ0FycmF5KGRhdGFiaW5kaW5nTmFtZSkpKTsKLSAJCUZpZWxkIERBVEFfQklORElOR19UWVBFX09QVElPTl9GSUVMRCA9IENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzQ2xhc3MKLSAJCQkJCQkJCQkJCQkJLmdldEZpZWxkKCJEQVRBX0JJTkRJTkdfVFlQRV9PUFRJT04iKTsKLQkJb3B0aW9uTWFwLnB1dCgoU3RyaW5nKURBVEFfQklORElOR19UWVBFX09QVElPTl9GSUVMRC5nZXQoU3RyaW5nLmNsYXNzKSwKLQkJCQkJCQlDb21tYW5kTGluZU9wdGlvbkNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKAotCQkJCQkJCSAgbmV3IE9iamVjdFtdeyhTdHJpbmcpREFUQV9CSU5ESU5HX1RZUEVfT1BUSU9OX0ZJRUxELmdldChTdHJpbmcuY2xhc3MpLAotCQkJCQkJCSAgZ2V0U3RyaW5nQXJyYXkoZGF0YWJpbmRpbmdOYW1lKX0pKTsKLSAgICAgICAKLSAgICAgICAvL3BvcnQgbmFtZQotICAgICAgIGlmIChwb3J0TmFtZSE9bnVsbCl7Ci0JCQkJCQkJLy8JICAgICAgIG9wdGlvbk1hcC5wdXQoQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlBPUlRfTkFNRV9PUFRJT04sCi0JCQkJCQkJLy8JICAgIAkJICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotCQkJCQkJCS8vCSAgICAJCSAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5QT1JUX05BTUVfT1BUSU9OLAotCQkJCQkJCS8vCSAgICAJCSAgIGdldFN0cmluZ0FycmF5KHBvcnROYW1lKSkpOwotICAgICAJCUZpZWxkIFBPUlRfTkFNRV9PUFRJT05fRklFTEQgPSBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50c0NsYXNzCi0gICAgIAkJCQkJCQkJCQkJCQkJLmdldEZpZWxkKCJQT1JUX05BTUVfT1BUSU9OIik7Ci0gICAgCQlvcHRpb25NYXAucHV0KChTdHJpbmcpUE9SVF9OQU1FX09QVElPTl9GSUVMRC5nZXQoU3RyaW5nLmNsYXNzKSwKLSAgICAJCQkJCQlDb21tYW5kTGluZU9wdGlvbkNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKAotICAgIAkJCQkJCQkJbmV3IE9iamVjdFtdeyhTdHJpbmcpUE9SVF9OQU1FX09QVElPTl9GSUVMRC5nZXQoU3RyaW5nLmNsYXNzKSwKLSAgICAJCQkJCQkJCWdldFN0cmluZ0FycmF5KHBvcnROYW1lKX0pKTsKLSAgICAgICB9Ci0gICAgICAgLy9zZXJ2aWNlIG5hbWUKLSAgICAgICBpZiAoc2VydmljZU5hbWUhPSBudWxsKXsKLQkJCQkJCQkvLwkgICAgICAgb3B0aW9uTWFwLnB1dChDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuU0VSVklDRV9OQU1FX09QVElPTiwKLQkJCQkJCQkvLwkgICAgCQkgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0JCQkJCQkJLy8JICAgIAkJICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlNFUlZJQ0VfTkFNRV9PUFRJT04sCi0JCQkJCQkJLy8JICAgIAkJICAgZ2V0U3RyaW5nQXJyYXkoc2VydmljZU5hbWUpKSk7Ci0gICAgIAkJRmllbGQgU0VSVklDRV9OQU1FX09QVElPTl9GSUVMRCA9IENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzQ2xhc3MKLSAgICAgCQkJCQkJCQkJCQkJCS5nZXRGaWVsZCgiU0VSVklDRV9OQU1FX09QVElPTiIpOwotICAgIAkJb3B0aW9uTWFwLnB1dCgoU3RyaW5nKVNFUlZJQ0VfTkFNRV9PUFRJT05fRklFTEQuZ2V0KFN0cmluZy5jbGFzcyksCi0gICAgCQkJCQlDb21tYW5kTGluZU9wdGlvbkNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKAotICAgIAkJCQkJCQluZXcgT2JqZWN0W117KFN0cmluZylTRVJWSUNFX05BTUVfT1BUSU9OX0ZJRUxELmdldChTdHJpbmcuY2xhc3MpLAotICAgIAkJCQkJCQkJCWdldFN0cmluZ0FycmF5KHNlcnZpY2VOYW1lKX0pKTsKLSAgICAgICB9Ci0gICAgICAgLy9uczJwa2cgbWFwcGluZwotICAgICAgIGlmIChuYW1lc3BhY2UycGFja2FnZUxpc3QhPSBudWxsKXsKLQkJCQkJCQkvLwkgICAgICAgb3B0aW9uTWFwLnB1dChDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuTkFNRV9TUEFDRV9UT19QQUNLQUdFX09QVElPTiwKLQkJCQkJCQkvLwkgICAgCQkgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0JCQkJCQkJLy8JICAgIAkJICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLk5BTUVfU1BBQ0VfVE9fUEFDS0FHRV9PUFRJT04KLQkJCQkJCQkvLwkgICAgCQkgICAsIGdldFN0cmluZ0FycmF5KG5hbWVzcGFjZTJwYWNrYWdlTGlzdCkpKTsKLSAgICAgCQlGaWVsZCBOQU1FX1NQQUNFX1RPX1BBQ0tBR0VfT1BUSU9OX0ZJRUxEID0gQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHNDbGFzcwotICAgICAJCQkJCQkJCQkJCS5nZXRGaWVsZCgiTkFNRV9TUEFDRV9UT19QQUNLQUdFX09QVElPTiIpOwotICAgIAkJb3B0aW9uTWFwLnB1dCgoU3RyaW5nKU5BTUVfU1BBQ0VfVE9fUEFDS0FHRV9PUFRJT05fRklFTEQuZ2V0KFN0cmluZy5jbGFzcyksCi0gICAgCQkJCUNvbW1hbmRMaW5lT3B0aW9uQ29uc3RydWN0b3IubmV3SW5zdGFuY2UoCi0gICAgCQkJCQluZXcgT2JqZWN0W117KFN0cmluZylOQU1FX1NQQUNFX1RPX1BBQ0tBR0VfT1BUSU9OX0ZJRUxELmdldChTdHJpbmcuY2xhc3MpLAotICAgIAkJCQkJZ2V0U3RyaW5nQXJyYXkobmFtZXNwYWNlMnBhY2thZ2VMaXN0KX0pKTsKLSAgICAgICB9Ci0gICAgICAgCi0KLSAgICAgICBpZiAobmFtZXNwYWNlMnBhY2thZ2VMaXN0IT0gbnVsbCl7Ci0gICAgCSAgIEZpZWxkIFNPVVJDRV9GT0xERVJfTkFNRV9PUFRJT04gPSBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50c0NsYXNzCi0JCQkuZ2V0RmllbGQoIlNPVVJDRV9GT0xERVJfTkFNRV9PUFRJT04iKTsKLSAgICAJICAgb3B0aW9uTWFwLnB1dCgoU3RyaW5nKVNPVVJDRV9GT0xERVJfTkFNRV9PUFRJT04uZ2V0KFN0cmluZy5jbGFzcyksCi0gICAgCQkJICAgQ29tbWFuZExpbmVPcHRpb25Db25zdHJ1Y3Rvci5uZXdJbnN0YW5jZSgKLSAgICAJCQkJCSAgIG5ldyBPYmplY3RbXXsoU3RyaW5nKVNPVVJDRV9GT0xERVJfTkFNRV9PUFRJT04uZ2V0KFN0cmluZy5jbGFzcyksCi0gICAgCQkJCQkJCSAgIGdldFN0cmluZ0FycmF5KHNvdXJjZUZvbGRlcil9KSk7Ci0gICAgICAgfQotICAgICAgIAotICAgICAgIC8vc2VydmVyIHNpZGUgaW50ZXJmYWNlICBtYXBwaW5nCi0gICAgICAgaWYgKGlzU2VydmVyU2lkZUludGVyZmFjZSl7Ci0JCQkJCQkJLy8JICAgICAgIG9wdGlvbk1hcC5wdXQoQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlNFUlZFUl9TSURFX0lOVEVSRkFDRV9PUFRJT04sCi0JCQkJCQkJLy8JICAgIAkJICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotCQkJCQkJCS8vCSAgICAJCSAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TRVJWRVJfU0lERV9JTlRFUkZBQ0VfT1BUSU9OLAotCQkJCQkJCS8vCSAgICAJCSAgIG5ldyBTdHJpbmdbMF0pKTsKLSAgICAgCQlGaWVsZCBTRVJWRVJfU0lERV9JTlRFUkZBQ0VfT1BUSU9OX0ZJRUxEID0gQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHNDbGFzcwotICAgICAJCQkJCQkJCQkJCS5nZXRGaWVsZCgiU0VSVkVSX1NJREVfSU5URVJGQUNFX09QVElPTiIpOwotICAgIAkJb3B0aW9uTWFwLnB1dCgoU3RyaW5nKVNFUlZFUl9TSURFX0lOVEVSRkFDRV9PUFRJT05fRklFTEQuZ2V0KFN0cmluZy5jbGFzcyksCi0gICAgCQkJCUNvbW1hbmRMaW5lT3B0aW9uQ29uc3RydWN0b3IubmV3SW5zdGFuY2UoCi0gICAgCQkJCQluZXcgT2JqZWN0W117KFN0cmluZylTRVJWRVJfU0lERV9JTlRFUkZBQ0VfT1BUSU9OX0ZJRUxELmdldChTdHJpbmcuY2xhc3MpLAotICAgIAkJCQkJbmV3IFN0cmluZ1swXX0pKTsKLSAgICAgICB9Ci0gICAgICAgCi0gICAgIH1jYXRjaChFeGNlcHRpb24gZSl7Ci0gICAgCSBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICB9Ci0gICAgICAgcmV0dXJuIG9wdGlvbk1hcDsKLSAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRCYXNlVXJpKFN0cmluZyB3c2RsVVJJKXsKLSAgICAJCi0gICAgCXRyeSB7Ci0JCQlVUkwgdXJsOwotCQkJaWYgKHdzZGxVUkkuaW5kZXhPZigiOi8vIik9PS0xKXsKLQkJCQl1cmwgPSBuZXcgVVJMKCJmaWxlIiwiIix3c2RsVVJJKTsKLQkJCX1lbHNlewotCQkJCXVybCA9IG5ldyBVUkwod3NkbFVSSSk7CQotCQkJfQotCi0JCQkKLQkJCVN0cmluZyBiYXNlVXJpOwotCQkJaWYgKCJmaWxlIi5lcXVhbHModXJsLmdldFByb3RvY29sKCkpKXsKLQkJCQliYXNlVXJpID0gbmV3IEZpbGUodXJsLmdldEZpbGUoKSkuZ2V0UGFyZW50RmlsZSgpLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJCX1lbHNlewotCQkJCWJhc2VVcmkgPSB1cmwudG9FeHRlcm5hbEZvcm0oKS5zdWJzdHJpbmcoMCwKLQkJCQkJCXVybC50b0V4dGVybmFsRm9ybSgpLmxhc3RJbmRleE9mKCIvIikKLQkJCQkpOwotCQkJfQotCQkKLQkJCQotCQkJcmV0dXJuIGJhc2VVcmk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZWFkcyB0aGUgV1NETCBPYmplY3QgTW9kZWwgZnJvbSB0aGUgZ2l2ZW4gbG9jYXRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIHdzZGxVUkkgdGhlIGZpbGVzeXN0ZW0gbG9jYXRpb24gKGZ1bGwgcGF0aCkgb2YgdGhlIFdTREwgZmlsZSB0byByZWFkIGluLgotICAgICAqIEByZXR1cm4gdGhlIFdTRExEZXNjcmlwdGlvbiBvYmplY3QgY29udGFpbmluZyB0aGUgV1NETCBPYmplY3QgTW9kZWwgb2YgdGhlIGdpdmVuIFdTREwgZmlsZQotICAgICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbiB3aGVuIFdTREwgRmlsZSBpcyBpbnZhbGlkCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBlcnJvcnMgcmVhZGluZyB0aGUgV1NETCBmaWxlCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRBeGlzU2VydmljZShTdHJpbmcgd3NkbFVSSSwgT2JqZWN0IHNlcnZpY2VRTmFtZSwgU3RyaW5nIHBvcnROYW1lKSB0aHJvd3MgRXhjZXB0aW9uewotICAgIAkKLSAgICAJCVVSTCB1cmw7Ci0JCQlpZiAod3NkbFVSSS5pbmRleE9mKCI6Ly8iKT09LTEpewotCQkJCXVybCA9IG5ldyBVUkwoImZpbGUiLCIiLHdzZGxVUkkpOwotCQkJfWlmICh3c2RsVVJJLmluZGV4T2YoIjovIik9PS0xKXsKLQkJCQl1cmwgPSBuZXcgVVJMKCJmaWxlIiwiIix3c2RsVVJJKTsKLQkJCX0KLQkJCWVsc2V7Ci0JCQkJdXJsID0gbmV3IFVSTCh3c2RsVVJJKTsJCi0JCQl9Ci0KLQkJCS8vRklYTUUgQGF1dGhvciBzb2kgLSAKLQkJICAgIC8vIFRoaXMgcXVpY2sgZml4IGFzc3VtZSB0aGF0IHRoZSB3c2RsVVJJIHBvaW50cyB0byBhIHdzZGwgMS4xIHZlcnNpb24uCi0JCQkvLyBBIGJldHRlciBmaXggc2hvdWxkIGJlIHRvIGRldGVybWluZSB3aGljaCBidWlsZGVyIHRvIHVzZSBiYXNlZCBvbiB0aGUgd3NkbCB2ZXJzaW9uLiAKLQkJCS8vIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIHRoZSB3c2RsIGJ1aWxkZXIgY2xhc3NlcyBkaWQgbm90IGFsbG93IGZvciB0aGlzLiAKLQkJCS8vIEkgd2lsbCBzdWdnZXN0dGhhdCB0aGUgZGV0ZXJtaW5hdGlvbiBvZiB3aGljaCBidWlsZGVyIHRvIHVzZSBzaG91bGQgYmUgZG9uZSBpbgotCQkJLy8gdGhlIGJ1aWxkZXIgY2xhc3NlcywgcHJlZmVyYWJseSBpbiB0aGUgcGFyZW50IGJ1aWxkZXIgY2xhc3MuIEFjY2Vzc2FibGUgdGhyb3VnaCBhCi0JCQkvLyBzdGF0aWMgcmVmZXJlbmNlIHRvIGEgbWV0aG9kIGxpa2UgZ2V0QnVpbGRlckluc3RhbmNlKFN0cmluZyB3c2RsVVJJKSBpbiB0aGUgcGFyZW50Ci0JCQkvL2J1aWxkZXIgY2xhc3Mgb3IgdGhyb3VnaCBhIGJ1aWxkZXIgQWJzdHJhY3QgRmFjdG9yIG9yIEFic3RyYWN0IGZhY3RvcnkgbWV0aG9kcy4KLQkJCQotCQkJCi0JCQkvL1dTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXIoCi0JCQkvLwkJCQkJCQkJCQkJdXJsLm9wZW5Db25uZWN0aW9uKCkuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0JCQkJCQkJLy8JCQlidWlsZGVyLnNldEJhc2VVcmkoZ2V0QmFzZVVyaSh3c2RsVVJJKSk7Ci0JCQkJCQkJLy8JCQlyZXR1cm4gYnVpbGRlci5wb3B1bGF0ZVNlcnZpY2UoKTsKLQkJCQotCQkJLy9SZWZsZWN0aW9uIGludm9jYXRpb24KLQkJCS8vQ2xhc3MgV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXJDbGFzcyA9IENsYXNzTG9hZGluZ1V0aWwubG9hZENsYXNzRnJvbUF4aXMyTGliUGF0aCgKLQkJCS8vICAgICAgICAgICAgICAgIHByb2plY3ROYW1lLAotCQkJLy8gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXIiKTsKLQkJCUNsYXNzIFdTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyQ2xhc3MgPSBDbGFzc0xvYWRpbmdVdGlsLmxvYWRDbGFzc0Zyb21BbnRDbGFzc0xvYWRlcigKLQkJCQkJIm9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXIiKTsKLQkJCUNsYXNzIFFOYW1lQ2xhc3MgPSBDbGFzc0xvYWRpbmdVdGlsLmxvYWRDbGFzc0Zyb21BbnRDbGFzc0xvYWRlcigiamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSIpOwotCQkJQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBXU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlckNsYXNzLmdldENvbnN0cnVjdG9yKAotCQkJCQluZXcgQ2xhc3NbXXtJbnB1dFN0cmVhbS5jbGFzcywgUU5hbWVDbGFzcywgU3RyaW5nLmNsYXNzfSk7Ci0JCQlPYmplY3QgV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXJJbnN0YW5jZSA9IGNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKAotCQkJCQluZXcgT2JqZWN0W117dXJsLm9wZW5Db25uZWN0aW9uKCkuZ2V0SW5wdXRTdHJlYW0oKSxzZXJ2aWNlUU5hbWUscG9ydE5hbWV9KTsKLQkJCU1ldGhvZCBzZXRCYXNlVXJpTWV0aG9kID0gV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXJDbGFzcy5nZXRNZXRob2QoCi0JCQkJCSJzZXRCYXNlVXJpIiwgCi0JCQkJCW5ldyBDbGFzc1tde1N0cmluZy5jbGFzc30pOwotCQkJc2V0QmFzZVVyaU1ldGhvZC5pbnZva2UoCi0JCQkJCVdTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVySW5zdGFuY2UsIAotCQkJCQluZXcgT2JqZWN0W117d3NkbFVSSX0pOwotCQkJCi0JCQkvL0ZpeCBmb3IgdGhlIEF4aXMyIDEuMiAKLQkJCS8vYnVpbGRlci5zZXRDb2RlZ2VuKHRydWUpOwotCQkJTWV0aG9kIHNldENvZGVnZW5NZXRob2QgPSBXU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlckNsYXNzLmdldE1ldGhvZCgKLQkJCQkJInNldENvZGVnZW4iLCAKLQkJCQkJbmV3IENsYXNzW117Ym9vbGVhbi5jbGFzc30pOwotCQkJc2V0Q29kZWdlbk1ldGhvZC5pbnZva2UoCi0JCQkJCVdTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVySW5zdGFuY2UsIAotCQkJCQluZXcgT2JqZWN0W117dHJ1ZX0pOwotCQkJCi0JCQlNZXRob2QgcG9wdWxhdGVTZXJ2aWNlTWV0aG9kID0gV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXJDbGFzcy5nZXRNZXRob2QoCi0JCQkJCSJwb3B1bGF0ZVNlcnZpY2UiLCAKLQkJCQkJbnVsbCk7Ci0JCQlyZXR1cm4gcG9wdWxhdGVTZXJ2aWNlTWV0aG9kLmludm9rZShXU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlckluc3RhbmNlLCBudWxsKTsKLQkJCQotCQkJLy9yZXR1cm4gdGhpcyBpbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIHNpbmdsZSBTdHJpbmcgaW50byBhIFN0cmluZyBBcnJheQotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSBhIHNpbmdsZSBzdHJpbmcKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgb25seSBvbmUgZWxlbWVudAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nW10gZ2V0U3RyaW5nQXJyYXkoU3RyaW5nIHZhbHVlKQotICAgIHsKLSAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBuZXcgU3RyaW5nWzFdOwotICAgICAgIHZhbHVlc1swXSA9IHZhbHVlOwotICAgICAgIHJldHVybiB2YWx1ZXM7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29uc3VtcHRpb24vY29yZS91dGlscy9XU0RMUHJvcGVydHlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb25zdW1wdGlvbi9jb3JlL3V0aWxzL1dTRExQcm9wZXJ0eVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjliODg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb25zdW1wdGlvbi9jb3JlL3V0aWxzL1dTRExQcm9wZXJ0eVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDExOCAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiAKLSAqIAkJCQkJCQkJCQkgIHJ1bnRpbWUgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzYyCi0gKiAyMDA3MDQyNiAgIDE4MzA0NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKiAyMDA3MDUwNyAgIDE4NDcyOSBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKiAyMDA4MDYyMSAgIDIwMDA2OSBzYW1pbmRhd0B3c28yLmNvbSAtIFNhbWluZGEgV2lqZXJhdG5lLCBzYXZpbmcgdGhlIHJldHJpZXZlZCBXU0RMIHNvIG5vIG5lZWQgdG8gcmV0cmlldmUgaXQgYWdhaW4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLnV0aWxzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLmRhdGEuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUudXRpbHMuQ2xhc3NMb2FkaW5nVXRpbDsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJlc2VudHMgYSBjb252ZW5pZW50IHdheSBvZiByZWFkaW5nIHRoZSAKLSAqIFdTREwgZmlsZSh1cmwpIGFuZCBwcm9kdWNpbmcgYSB1c2VmdWwgc2V0IG9mIGluZm9ybWF0aW9uCi0gKiBJdCBkb2VzIE5PVCB1c2UgYW55IG9mIHRoZSBzdGFuZGFyZCBXU0RMIGNsYXNzZXMgZnJvbSAKLSAqIEF4aXMyLCByYXRoZXIgaXQgdXNlcyB3c2RsNGogdG8gcmVhZCB0aGUgd3NkbCBhbmQgZXh0cmFjdCAKLSAqIHRoZSBwcm9wZXJ0aWVzIChUaGlzIGlzIG1lYW50IGFzIGEgY29udmVuaWVuY2UgZm9yIHRoZSBVSQotICogb25seS4gV2UgbWF5IG5vdCBuZWVkIHRoZSB3aG9sZSBjb252ZXJzaW9uIHRoZSBXU0RMcHVtcCAKLSAqIGdvZXMgdGhyb3VnaCkKLSAqIE9uZSB3b3VsZCBuZWVkIHRvIGNoYW5nZSB0aGlzIHRvIHN1aXQgYSBwcm9wZXIgV1NETCAKLSAqLwotcHVibGljIGNsYXNzIFdTRExQcm9wZXJ0eVJlYWRlciB7Ci0KLQotCS8vcHJpdmF0ZSBEZWZpbml0aW9uIHdzZGxEZWZpbml0aW9uID0gbnVsbDsKLQlwcml2YXRlIE9iamVjdCBEZWZpbml0aW9uSW5zdGFuY2UgPSBudWxsOwotCXByaXZhdGUgQ2xhc3MgRGVmaW5pdGlvbkNsYXNzID0gbnVsbDsKLQlwcml2YXRlIENsYXNzIFNlcnZpY2VDbGFzcyA9IG51bGw7Ci0JcHJpdmF0ZSBNb2RlbCBtb2RlbDsKLQotCXB1YmxpYyBXU0RMUHJvcGVydHlSZWFkZXIoTW9kZWwgbW9kZWwpewotCQl0aGlzLm1vZGVsPW1vZGVsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWFkV1NETChTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBmaWxlcGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlDbGFzc0xvYWRpbmdVdGlsLmluaXQocHJvamVjdE5hbWUpOwotCQkKLQkJRGVmaW5pdGlvbkNsYXNzID0gQ2xhc3NMb2FkaW5nVXRpbC5sb2FkQ2xhc3NGcm9tQW50Q2xhc3NMb2FkZXIoImphdmF4LndzZGwuRGVmaW5pdGlvbiIpOwotCQkKLQkJLy8JCVdTRExSZWFkZXIgcmVhZGVyID0gV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdXU0RMUmVhZGVyKCk7Ci0JCS8vCQl3c2RsRGVmaW5pdGlvbiA9IHJlYWRlci5yZWFkV1NETChmaWxlcGF0aCk7IAotCi0JCWlmICghbW9kZWwuaXNXc2RsQWxyZWFkeUxvYWRlZChmaWxlcGF0aCkpewotCQkJQ2xhc3MgV1NETEZhY3RvcnlDbGFzcyA9IENsYXNzTG9hZGluZ1V0aWwKLQkJCQkJLmxvYWRDbGFzc0Zyb21BbnRDbGFzc0xvYWRlcigiamF2YXgud3NkbC5mYWN0b3J5LldTRExGYWN0b3J5Iik7Ci0JCQlNZXRob2QgbmV3SW5zdGFuY2VNZXRob2QgPSBXU0RMRmFjdG9yeUNsYXNzLmdldE1ldGhvZCgibmV3SW5zdGFuY2UiLCBudWxsKTsKLQkJCU9iamVjdCBXU0RMRmFjdG9yeU9iamVjdCA9IG5ld0luc3RhbmNlTWV0aG9kLmludm9rZShudWxsLCBudWxsKTsKLQkJCUNsYXNzIFdTRExGYWN0b3J5SW1wbENsYXNzID0gQ2xhc3NMb2FkaW5nVXRpbAotCQkJCQkubG9hZENsYXNzRnJvbUFudENsYXNzTG9hZGVyKFdTRExGYWN0b3J5T2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJCU1ldGhvZCBuZXdXU0RMUmVhZGVyTWV0aG9kID0gV1NETEZhY3RvcnlJbXBsQ2xhc3MuZ2V0TWV0aG9kKCJuZXdXU0RMUmVhZGVyIiwgbnVsbCk7Ci0JCQlPYmplY3QgV1NETFJlYWRlck9iamVjdCA9IG5ld1dTRExSZWFkZXJNZXRob2QuaW52b2tlKFdTRExGYWN0b3J5T2JqZWN0LCBudWxsKTsKLQkJCUNsYXNzIFdTRExSZWFkZXJDbGFzcyA9IENsYXNzTG9hZGluZ1V0aWwKLQkJCQkJLmxvYWRDbGFzc0Zyb21BbnRDbGFzc0xvYWRlcihXU0RMUmVhZGVyT2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJCU1ldGhvZCByZWFkV1NETE1ldGhvZCA9IFdTRExSZWFkZXJDbGFzcy5nZXRNZXRob2QoInJlYWRXU0RMIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzfSk7Ci0JCQltb2RlbC5zZXRXc2RsRGVmaW5pdGlvbkluc3RhbmNlKAotCQkJCQlyZWFkV1NETE1ldGhvZC5pbnZva2UoV1NETFJlYWRlck9iamVjdCwgbmV3IE9iamVjdFtde2ZpbGVwYXRofSksZmlsZXBhdGgpOwotCQl9Ci0JCQotCQlEZWZpbml0aW9uSW5zdGFuY2UgPSBtb2RlbC5nZXRXc2RsRGVmaW5pdGlvbkluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZXNwYWNlIG1hcCBmcm9tIGRlZmluaXRpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE1hcCBnZXREZWZpbml0aW9uTmFtZXNwYWNlTWFwKCl7Ci0JCS8vcmV0dXJuIHdzZGxEZWZpbml0aW9uLmdldE5hbWVzcGFjZXMoKTsKLQkJTWFwIG1hcCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlNZXRob2QgZ2V0TmFtZXNwYWNlc01ldGhvZCA9IERlZmluaXRpb25DbGFzcy5nZXRNZXRob2QoImdldE5hbWVzcGFjZXMiLCBudWxsKTsKLQkJCW1hcCA9IChNYXApZ2V0TmFtZXNwYWNlc01ldGhvZC5pbnZva2UoRGVmaW5pdGlvbkluc3RhbmNlLCBudWxsKTsKLQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbWFwOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZGVmYXVsdCBwYWNrYWdlIGRlcml2ZWQgYnkgdGhlIHRhcmdldE5hbWVzcGFjZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgcGFja2FnZUZyb21UYXJnZXROYW1lc3BhY2UoKXsKLQkJLy9yZXR1cm4gIFVSTFByb2Nlc3Nvci5tYWtlUGFja2FnZU5hbWUod3NkbERlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotCQlTdHJpbmcgcmV0dXJuU3RyaW5nID0gbnVsbDsKLQkJdHJ5ewotCQkJTWV0aG9kIGdldFRhcmdldE5hbWVzcGFjZU1ldGhvZCA9IERlZmluaXRpb25DbGFzcy5nZXRNZXRob2QoImdldFRhcmdldE5hbWVzcGFjZSIsIG51bGwpOwotCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gKFN0cmluZylnZXRUYXJnZXROYW1lc3BhY2VNZXRob2QuaW52b2tlKERlZmluaXRpb25JbnN0YW5jZSwgbnVsbCk7Ci0JCQlDbGFzcyBVUkxQcm9jZXNzb3JDbGFzcyA9IENsYXNzTG9hZGluZ1V0aWwKLQkJCQkJLmxvYWRDbGFzc0Zyb21BbnRDbGFzc0xvYWRlcigib3JnLmFwYWNoZS5heGlzMi51dGlsLlVSTFByb2Nlc3NvciIpOwotCQkJTWV0aG9kIG1ha2VQYWNrYWdlTmFtZU1ldGhvZCA9IFVSTFByb2Nlc3NvckNsYXNzCi0JCQkJCS5nZXRNZXRob2QoIm1ha2VQYWNrYWdlTmFtZSIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzc30pOwotCQkJcmV0dXJuU3RyaW5nID0gKFN0cmluZyltYWtlUGFja2FnZU5hbWVNZXRob2QuaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXXtwYWNrYWdlTmFtZX0pOwotCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJcmV0dXJuIHJldHVyblN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZXJ2aWNlIG5hbWVzCi0JICogdGhlIG5hbWVzIGFyZSBRTmFtZXMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIExpc3QgZ2V0U2VydmljZUxpc3QoKXsKLQkJLy9TZXJ2aWNlIHNlcnZpY2UgPSBudWxsOwotCQkvL01hcCBzZXJ2aWNlTWFwID0gd3NkbERlZmluaXRpb24uZ2V0U2VydmljZXMoKTsKLQkJLy9zZXJ2aWNlID0gKFNlcnZpY2Upc2VydmljZUl0ZXJhdG9yLm5leHQoKTsKLQkJLy9yZXR1cm5MaXN0LmFkZChzZXJ2aWNlLmdldFFOYW1lKCkpOwotCQlMaXN0IHJldHVybkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeXsKLQkJCU9iamVjdCBzZXJ2aWNlSW5zdGFuY2U7Ci0JCQlNZXRob2QgZ2V0U2VydmljZXNNZXRob2QgPSBEZWZpbml0aW9uQ2xhc3MuZ2V0TWV0aG9kKCJnZXRTZXJ2aWNlcyIsIG51bGwpOwotCQkJTWFwIHNlcnZpY2VNYXAgPSAoTWFwKWdldFNlcnZpY2VzTWV0aG9kLmludm9rZShEZWZpbml0aW9uSW5zdGFuY2UsIG51bGwpOwotCi0JCQlpZihzZXJ2aWNlTWFwIT1udWxsICYmICFzZXJ2aWNlTWFwLmlzRW1wdHkoKSl7Ci0JCQkJSXRlcmF0b3Igc2VydmljZUl0ZXJhdG9yID0gc2VydmljZU1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlKHNlcnZpY2VJdGVyYXRvci5oYXNOZXh0KCkpewotCQkJCQlTZXJ2aWNlQ2xhc3MgPSBDbGFzc0xvYWRpbmdVdGlsCi0JCQkJCQkJLmxvYWRDbGFzc0Zyb21BbnRDbGFzc0xvYWRlcigiamF2YXgud3NkbC5TZXJ2aWNlIik7Ci0JCQkJCU1ldGhvZCBnZXRRTmFtZU1ldGhvZCA9IFNlcnZpY2VDbGFzcy5nZXRNZXRob2QoImdldFFOYW1lIiwgbnVsbCk7Ci0JCQkJCXNlcnZpY2VJbnN0YW5jZSA9IChPYmplY3Qpc2VydmljZUl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJcmV0dXJuTGlzdC5hZGQoZ2V0UU5hbWVNZXRob2QuaW52b2tlKHNlcnZpY2VJbnN0YW5jZSwgbnVsbCkpOyAgIAotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gcmV0dXJuTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBwb3J0cyBmb3IgYSBwYXJ0aWN1bGFyIHNlcnZpY2UKLQkgKiB0aGUgbmFtZXMgYXJlIFFOYW1lcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQb3J0TmFtZUxpc3QoT2JqZWN0IHNlcnZpY2VOYW1lKXsKLQkJLy9MaXN0IHJldHVybkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vU2VydmljZSBzZXJ2aWNlID0gd3NkbERlZmluaXRpb24uZ2V0U2VydmljZShzZXJ2aWNlTmFtZSk7Ci0JCS8vUG9ydCBwb3J0ID0gbnVsbDsgCi0JCS8vaWYoc2VydmljZSE9bnVsbCl7Ci0JCS8vCU1hcCBwb3J0TWFwID0gc2VydmljZS5nZXRQb3J0cygpOwotCQkvLwlpZiAocG9ydE1hcCE9bnVsbCAmJiAhcG9ydE1hcC5pc0VtcHR5KCkpewotCQkvLwkJSXRlcmF0b3IgcG9ydEl0ZXJhdG9yID0gcG9ydE1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkvLwkJd2hpbGUocG9ydEl0ZXJhdG9yLmhhc05leHQoKSl7Ci0JCS8vCQkJcG9ydCA9IChQb3J0KXBvcnRJdGVyYXRvci5uZXh0KCk7Ci0JCS8vCQkJcmV0dXJuTGlzdC5hZGQocG9ydC5nZXROYW1lKCkpOwotCQkvLwkJfQotCQkvLwl9Ci0JCS8vfQotCQkvL3JldHVybiByZXR1cm5MaXN0OwotCi0JCUxpc3QgcmV0dXJuTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdHJ5ewkKLQkJCU1ldGhvZCBnZXRTZXJ2aWNlTWV0aG9kID0gRGVmaW5pdGlvbkNsYXNzCi0JCQkJCQkuZ2V0TWV0aG9kKCJnZXRTZXJ2aWNlIiwgbmV3IENsYXNzW117c2VydmljZU5hbWUuZ2V0Q2xhc3MoKX0pOwotCQkJT2JqZWN0IHNlcnZpY2VJbnN0YW5jZSA9IGdldFNlcnZpY2VNZXRob2QKLQkJCQkJCS5pbnZva2UoRGVmaW5pdGlvbkluc3RhbmNlLCBuZXcgT2JqZWN0W117c2VydmljZU5hbWV9KTsKLQkJCU9iamVjdCBwb3J0SW5zdGFuY2UgPSBudWxsOwotCQkJaWYoc2VydmljZUluc3RhbmNlIT1udWxsKXsKLQkJCQlNZXRob2QgZ2V0UG9ydHNNZXRob2QgPSBTZXJ2aWNlQ2xhc3MuZ2V0TWV0aG9kKCJnZXRQb3J0cyIsIG51bGwpOwotCQkJCU1hcCBwb3J0TWFwID0gKE1hcClnZXRQb3J0c01ldGhvZC5pbnZva2Uoc2VydmljZUluc3RhbmNlLCBudWxsKTsKLQkJCQlpZiAocG9ydE1hcCE9bnVsbCAmJiAhcG9ydE1hcC5pc0VtcHR5KCkpewotCQkJCQlJdGVyYXRvciBwb3J0SXRlcmF0b3IgPSBwb3J0TWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlKHBvcnRJdGVyYXRvci5oYXNOZXh0KCkpewotCQkJCQkJcG9ydEluc3RhbmNlID0gKE9iamVjdClwb3J0SXRlcmF0b3IubmV4dCgpOwotCQkJCQkJQ2xhc3MgUG9ydENsYXNzID0gQ2xhc3NMb2FkaW5nVXRpbAotCQkJCQkJCQkubG9hZENsYXNzRnJvbUFudENsYXNzTG9hZGVyKCJqYXZheC53c2RsLlBvcnQiKTsKLQkJCQkJCU1ldGhvZCBnZXROYW1lTWV0aG9kID0gUG9ydENsYXNzLmdldE1ldGhvZCgiZ2V0TmFtZSIsIG51bGwpOwotCQkJCQkJcmV0dXJuTGlzdC5hZGQoZ2V0TmFtZU1ldGhvZC5pbnZva2UocG9ydEluc3RhbmNlLG51bGwpKTsgCi0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gcmV0dXJuTGlzdDsKLQl9Ci0JCi0gICAgLyoqCi0gICAgICogcHVibGljIG1ldGhvZCB0byBnZXQgbG9hZGVkIHdzZGwgRGVmaW5pdGlvbiBJbnN0YW5jZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFdzZGxEZWZpbml0aW9uSW5zdGFuY2UoKSB7Ci0gICAgICAgICAgICByZXR1cm4gRGVmaW5pdGlvbkluc3RhbmNlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBwdWJsaWMgbWV0aG9kIHRvIGdldCBsb2FkZWQgRGVmaW5pdGlvbiBDbGFzcwotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0V3NkbERlZmluaXRpb25DbGFzcygpIHsKLSAgICAgICAgICAgIHJldHVybiBEZWZpbml0aW9uQ2xhc3M7Ci0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL2RhdGEvRGF0YU1vZGVsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY3JlYXRpb24vY29yZS9kYXRhL0RhdGFNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjY1OTMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL2RhdGEvRGF0YU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMTEwICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIAotICogCQkJCQkJCQkJCSAgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSAqIDIwMDcwNTE4ICAgMTg3MzExIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEZpeGluZyB0ZXN0IHJlc291cmNlIGFkZGl0aW9uCi0gKiAyMDA5MTIwNyAgIDE5Mzk5NiBzYW1pbmRhd0B3c28yLmNvbSAtIFNhbWluZGEgV2lqZXJhdG5lLCBzZWxlY3RpbmcgYSBzcGVjaWZpYyBzZXJ2aWNlL3BvcnRuYW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUuZGF0YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLmRhdGEuTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBEYXRhTW9kZWwgZXh0ZW5kcyBNb2RlbHsKLQkKLQkvL0NsaWVudCBTaWRlCi0JcHJpdmF0ZSBTdHJpbmcgc2VydmljZUNsYXNzOwotCXByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZVNlcnZpY2VzWE1MOwotCXByaXZhdGUgYm9vbGVhbiBzZXJ2aWNlc1hNTDsKLQlwcml2YXRlIGJvb2xlYW4gZ2VuZXJhdGVBQVI7Ci0JcHJpdmF0ZSBTdHJpbmcgIHBhdGhUb1NlcnZpY2VzWE1MOwotCXByaXZhdGUgU3RyaW5nICBwYXRoVG9XZWJTZXJ2aWNlc1RlbXBEaXI7Ci0JCi0JLy9TZXJ2ZXIgU2lkZSAKLQlwcml2YXRlIGJvb2xlYW4gZ2VuZXJhdGVTZXJ2ZXJTaWRlSW50ZXJmYWNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBzZXJ2ZXJYTUxDaGVjazsKLQlwcml2YXRlIGJvb2xlYW4gZ2VuZXJhdGVBbGxDaGVjazsKLQlwcml2YXRlIFN0cmluZyBkYXRhYmluZGluZ1R5cGU7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYXNlVG9QYWNrYWdlTWFwcGluZzsKLQotCi0JcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZVNlcnZpY2VzWE1MKCl7Ci0JCXJldHVybiBnZW5lcmF0ZVNlcnZpY2VzWE1MOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEdlbmVyYXRlU2VydmljZXNYTUwoYm9vbGVhbiBnZW5lcmF0ZVNlcnZpY2VzWE1MKXsKLQkJdGhpcy5nZW5lcmF0ZVNlcnZpY2VzWE1MID0gZ2VuZXJhdGVTZXJ2aWNlc1hNTDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGhUb1NlcnZpY2VzWE1MKCl7Ci0JCXJldHVybiBwYXRoVG9TZXJ2aWNlc1hNTDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXRoVG9TZXJ2aWNlc1hNTChTdHJpbmcgcGF0aFRvU2VydmljZXNYTUwpewotCQl0aGlzLnBhdGhUb1NlcnZpY2VzWE1MID0gcGF0aFRvU2VydmljZXNYTUw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZUFBUigpIHsKLQkJcmV0dXJuIGdlbmVyYXRlQUFSOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEdlbmVyYXRlQUFSKGJvb2xlYW4gZ2VuZXJhdGVBQVIpIHsKLQkJdGhpcy5nZW5lcmF0ZUFBUiA9IGdlbmVyYXRlQUFSOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU2VydmljZXNYTUwoKSB7Ci0JCXJldHVybiBzZXJ2aWNlc1hNTDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlc1hNTChib29sZWFuIHNlcnZpY2VzWE1MKSB7Ci0JCXRoaXMuc2VydmljZXNYTUwgPSBzZXJ2aWNlc1hNTDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGhUb1dlYlNlcnZpY2VzVGVtcERpcigpIHsKLQkJcmV0dXJuIHBhdGhUb1dlYlNlcnZpY2VzVGVtcERpcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXRoVG9XZWJTZXJ2aWNlc1RlbXBEaXIoU3RyaW5nIHBhdGhUb1dlYlNlcnZpY2VzVGVtcERpcikgewotCQl0aGlzLnBhdGhUb1dlYlNlcnZpY2VzVGVtcERpciA9IHBhdGhUb1dlYlNlcnZpY2VzVGVtcERpcjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFdzZGxVUkkoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRXc2RsVVJJKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0V3NkbFVSSShTdHJpbmcgd3NkbFVSSSkgewotCQlzdXBlci5zZXRXc2RsVVJJKHdzZGxVUkkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YWJpbmRpbmdUeXBlKCkgewotCQlyZXR1cm4gZGF0YWJpbmRpbmdUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERhdGFiaW5kaW5nVHlwZShTdHJpbmcgZGF0YWJpbmRpbmdUeXBlKSB7Ci0JCXRoaXMuZGF0YWJpbmRpbmdUeXBlID0gZGF0YWJpbmRpbmdUeXBlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVBbGxDaGVjaygpIHsKLQkJcmV0dXJuIGdlbmVyYXRlQWxsQ2hlY2s7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0R2VuZXJhdGVBbGxDaGVjayhib29sZWFuIGdlbmVyYXRlQWxsQ2hlY2spIHsKLQkJdGhpcy5nZW5lcmF0ZUFsbENoZWNrID0gZ2VuZXJhdGVBbGxDaGVjazsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZSgpIHsKLQkJcmV0dXJuIGdlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVNlcnZlclNpZGVJbnRlcmZhY2UoYm9vbGVhbiBnZW5lcmF0ZVNlcnZlclNpZGVJbnRlcmZhY2UpIHsKLQkJdGhpcy5nZW5lcmF0ZVNlcnZlclNpZGVJbnRlcmZhY2UgPSBnZW5lcmF0ZVNlcnZlclNpZGVJbnRlcmZhY2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQb3J0TmFtZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFBvcnROYW1lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UG9ydE5hbWUoU3RyaW5nIHBvcnROYW1lKSB7Ci0JCXN1cGVyLnNldFBvcnROYW1lKHBvcnROYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NlcnZlclhNTENoZWNrKCkgewotCQlyZXR1cm4gc2VydmVyWE1MQ2hlY2s7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VydmVyWE1MQ2hlY2soYm9vbGVhbiBzZXJ2ZXJYTUxDaGVjaykgewotCQl0aGlzLnNlcnZlclhNTENoZWNrID0gc2VydmVyWE1MQ2hlY2s7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlTmFtZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFNlcnZpY2VOYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYWNrYWdlVGV4dCgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFBhY2thZ2VUZXh0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFja2FnZVRleHQoU3RyaW5nIHBhY2thZ2VUZXh0KSB7Ci0JCXN1cGVyLnNldFBhY2thZ2VUZXh0KHBhY2thZ2VUZXh0KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VDbGFzcygpIHsKLQkJcmV0dXJuIHNlcnZpY2VDbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlQ2xhc3MoU3RyaW5nIHNlcnZpY2VDbGFzcykgewotCQl0aGlzLnNlcnZpY2VDbGFzcyA9IHNlcnZpY2VDbGFzczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFzZVRvUGFja2FnZU1hcHBpbmcoKSB7Ci0JCXJldHVybiBuYW1lc3Bhc2VUb1BhY2thZ2VNYXBwaW5nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWVzcGFzZVRvUGFja2FnZU1hcHBpbmcoU3RyaW5nIG5hbWVzcGFzZVRvUGFja2FnZU1hcHBpbmcpIHsKLQkJdGhpcy5uYW1lc3Bhc2VUb1BhY2thZ2VNYXBwaW5nID0gbmFtZXNwYXNlVG9QYWNrYWdlTWFwcGluZzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLnVpLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDRlODYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24udWkvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5YjZhODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24udWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYnVpbGQueG1sCi1qYXZhQ29tcGlsZXIuLi5hcmdzCi1AZG90Ci1vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24udWlfMS4wLjEwMS4yMDA4MDQwMjAyMDQuamFyCi10ZW1wLmZvbGRlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24udWkvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZkNjYyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNWMzZDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotI1N1biBNYXkgMDYgMTc6MzM6MjMgTEtUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDViN2M3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jV2VkIEZlYiAyMSAxMDo0ODoyNyBMS1QgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0Ci1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/PlxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGMzYjYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJVBMVUdJTl9OQU1FCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24udWk7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjEwMy5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzMi5jb25zdW1wdGlvbi51aS5wbHVnaW4uV2ViU2VydmljZUF4aXMyQ29uc3VtcHRpb25VSVBsdWdpbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLnVpLmlkZSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5qZHQuY29yZSwKLSBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLAotIG9yZy5lY2xpcHNlLmpzdC53cywKLSBvcmcuZWNsaXBzZS5qc3Qud3MudWksCi0gb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLAotIG9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSwKLSBvcmcuZWNsaXBzZS53c3Qud3MsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aSwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQsCi0gb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLAotIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLVZlbmRvcjogJVBMVUdJTl9QUk9WSURFUgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzMi5jb25zdW1wdGlvbi51aS5wbHVnaW4sCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMyLmNvbnN1bXB0aW9uLnVpLndpZGdldHMsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMyLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMyLmNvbnN1bXB0aW9uLnVpLndzcnQKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24udWkvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3OTliZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24udWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24udWkvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4Y2NjZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24udWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgV1NPMiBJbmMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSMgLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgMjAwNzAxMzAgICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgCi0jCQkJCQkJCQkJCQlBeGlzMiBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotIyAyMDA3MDUwMiAgIDE4NDMwMiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBGaXggY29weXJpZ2h0IGZvciBBeGlzMiBwbHVnaW5zCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24udWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3ZDcyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotIyAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyAyMDA3MDExOCAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotIyAyMDA3MDUwMSAgIDE4NDYxNyBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBQcm92aWRlIHBsdWdpbiBkZXRhaWxzCi0jIDIwMDgwNTMwICAgMjM0ODQxIGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuLCBDaGFuZ2UgcGx1Z2luIHByb3ZpZGVyIHRvIEVjbGlwc2Uub3JnCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0KLSMKLSMgTWVzc2FnZXMgaW4gcGx1Z2luLnhtbC4KLSMKLVBMVUdJTl9OQU1FPVdlYnNlcnZpY2UgQXhpczIgQ29uc3VtcHRpb24gVUkgUGx1Zy1pbgotUExVR0lOX1BST1ZJREVSPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLVdFQlNFUlZJQ0VDTElFTlRUWVBFX05BTUVfSkFWQV9BWElTPUphdmEgcHJveHkKLUxBQkVMX1JVTlRJTUVfQVhJU18xMT1BcGFjaGUgQXhpczIKLURFU0NfUlVOVElNRV9BWElTXzExPUFwYWNoZSBBeGlzMgotIwotIwlXZWIgU2VydmljZXMgUHJlZmVyYW5jZSBQYWdlcwotIwotIyBDYXRlZ29yaWVzCi1QUkVGRVJFTkNFX0NBVEVHT1JZX0FYSVMyX0VNSVRURVI9QXhpczIgRW1pdHRlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24udWkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMTRhZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24udWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTxwbHVnaW4+Ci0gICAKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0UmVnaXN0cnkiPgotICAgICAgIDx3aWRnZXRGYWN0b3J5ICAgCi0gICAgICAgICAgICAgaWQ9IkF4aXMyQ2xpZW50Q29uZmlnIgotICAgICAgICAgICAgIGluc2VydEJlZm9yZUNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZC5BeGlzMldlYnNlcnZpY2VzU2VydmVyQ29tbWFuZCIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMyLmNvbnN1bXB0aW9uLnVpLndzcnQuQXhpczJDbGllbnRDb25maWdXaWRnZXRGYWN0b3J5Ii8+Ci0gICAgPC9leHRlbnNpb24+IAotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5hbnREYXRhTWFwcGluZyI+Ci0gICAgICAgIDxtYXAKLSAgICAgICAgICAgICAga2V5PSJDbGllbnRQcm9qZWN0TmFtZSIKLSAgICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS5jb21tYW5kLkF4aXMyQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQiCi0gICAgICAgICAgICAgIHByb3BlcnR5PSJDbGllbnRQcm9qZWN0IgotICAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyIi8+Ci0gICAgPC9leHRlbnNpb24+IAotCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMyL2NvbnN1bXB0aW9uL3VpL3BsdWdpbi9XZWJTZXJ2aWNlQXhpczJDb25zdW1wdGlvblVJUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMyL2NvbnN1bXB0aW9uL3VpL3BsdWdpbi9XZWJTZXJ2aWNlQXhpczJDb25zdW1wdGlvblVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYzkxMmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzMi9jb25zdW1wdGlvbi91aS9wbHVnaW4vV2ViU2VydmljZUF4aXMyQ29uc3VtcHRpb25VSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDEzMCAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSAKLSAqIAkJCQkJCQkJCQkJQXhpczIgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSAqIDIwMDcwNTAyICAgMTg0MzAyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEZpeCBjb3B5cmlnaHQgZm9yIEF4aXMyIHBsdWdpbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpczIuY29uc3VtcHRpb24udWkucGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VBeGlzMkNvbnN1bXB0aW9uVUlQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLnVpIjsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBXZWJTZXJ2aWNlQXhpczJDb25zdW1wdGlvblVJUGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgV2ViU2VydmljZUF4aXMyQ29uc3VtcHRpb25VSVBsdWdpbigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VBeGlzMkNvbnN1bXB0aW9uVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpczIvY29uc3VtcHRpb24vdWkvdGFzay9EZWZhdWx0c0ZvckhUVFBCYXNpY0F1dGhDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMyL2NvbnN1bXB0aW9uL3VpL3Rhc2svRGVmYXVsdHNGb3JIVFRQQmFzaWNBdXRoQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTQ0YmMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpczIvY29uc3VtcHRpb24vdWkvdGFzay9EZWZhdWx0c0ZvckhUVFBCYXNpY0F1dGhDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMTMwICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIAotICogCQkJCQkJCQkJCQlBeGlzMiBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotICogMjAwNzA1MDIgICAxODQzMDIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgRml4IGNvcHlyaWdodCBmb3IgQXhpczIgcGx1Z2lucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzMi5jb25zdW1wdGlvbi51aS50YXNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdHNGb3JIVFRQQmFzaWNBdXRoQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pCi0JCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzMi9jb25zdW1wdGlvbi91aS93aWRnZXRzL0F4aXMyUHJveHlXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpczIvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9BeGlzMlByb3h5V2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNzZjOTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzMi9jb25zdW1wdGlvbi91aS93aWRnZXRzL0F4aXMyUHJveHlXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAxMzAgICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgQXhpczIgCi0gKiAJCQkJCQkJCQkJICBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotICogMjAwNzA0MjYgICAxODMwNDYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aAotICogMjAwNzA1MTMgICAxODY0MzAgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgZml4IGZvciAxODY0MzAKLSAqCQkJCQkJCQkJCSAgVGV4dCBub3QgYWNjZXNzaWJsZSBvbiBBWElTMiB3aXphcmQgcGFnZXMuCi0gKiAyMDA3MDUyMyAgIDE3NDg3NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBQZXJzaXN0IFByZWZlcmVuY2VzIGluc2lkZSBGcmFtZXdvcmsKLSAqIDIwMDcwODIzICAgMjAwNDEzIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIE5hbWVzcGFjZSB0byBQYWNrYWdlIHRhYmxlIGZpeAotICogMjAwNzA4MjQgICAyMDA1MTUgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgTk9OLU5MUyBtb3ZlIHRvIHNlcGVyYXRlIGZpbGUKLSAqIDIwMDcxMDMwCSAgMjA3NjE4IHppbmFAY2EuaWJtLmNvbSAtIFppbmEgTW9zdGFmaWEsIFBhZ2UgR1VJIHNlcXVlbmNlIHVzaW5nIHRhYiBpcyBub3QgY29ycmVjdCAoIHZpb2xhdGVzIEFjY2Vzc2liaWxpdHkpCi0gKiAyMDA4MDMxOSAgIDIwNzYxNiBtYWthbmRyZUBjYS5pYm0uY29tIC0gQW5kcmV3IE1haywgVGFibGUgaW4gQXhpczIgV2ViIFNlcnZpY2UgU2tlbGV0b24gSmF2YSBCZWFuIENvbmZpZ3VyYXRpb24gUGFnZSBub3QgQWNjZXNzaWJsZQotICogMjAwODA2MjEgICAyMDAwNjkgc2FtaW5kYXdAd3NvMi5jb20gLSBTYW1pbmRhIFdpamVyYXRuZSwgc2F2aW5nIHRoZSByZXRyaWV2ZWQgV1NETCBzbyBubyBuZWVkIHRvIHJldHJpZXZlIGl0IGFnYWluCi0gKiAyMDA5MDMwNyAgIDE5Njk1NCBzYW1pbmRhd0B3c28yLmNvbSAtIFNhbWluZGEgV2lqZXJhdG5lLCBTdXBwb3J0IFhNTEJlYW5zIGRhdGEgYmluZGluZwotICogMjAwOTEyMDcgICAxOTM5OTYgc2FtaW5kYXdAd3NvMi5jb20gLSBTYW1pbmRhIFdpamVyYXRuZSwgc2VsZWN0aW5nIGEgc3BlY2lmaWMgc2VydmljZS9wb3J0bmFtZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzMi5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLmRhdGEuRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLm1lc3NhZ2VzLkF4aXMyQ29uc3VtcHRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLnV0aWxzLldTRExQcm9wZXJ0eVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb25zdGFudC5BeGlzMkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb250ZXh0LkF4aXMyRW1pdHRlckNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUucGx1Z2luLldlYlNlcnZpY2VBeGlzMkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUudXRpbHMuQ2xhc3NMb2FkaW5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkucGx1Z2luLldlYlNlcnZpY2VBeGlzMlVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotCi1wdWJsaWMgY2xhc3MgQXhpczJQcm94eVdpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvciB7Ci0JCi0JRGF0YU1vZGVsIG1vZGVsOwotCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQotCi0JcHVibGljIEF4aXMyUHJveHlXaWRnZXQoRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXRoaXMubW9kZWw9bW9kZWw7Ci0JfQotCi0JLy9wcml2YXRlIFN0cmluZyBwbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLnVpIjsKLQkKLQlwcml2YXRlIEJ1dHRvbiBnZW5Qcm94eUNoZWNrYm94XzsKLQlwcml2YXRlIEJ1dHRvbiBzeW5jQW5kQXN5bmNSYWRpb0J1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBzeW5jT25seVJhZGlvQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIGFzeW5jT25seVJhZGlvQnV0dG9uOwotCS8vcHJpdmF0ZSBCdXR0b24gdGVzdENhc2VDaGVja0JveEJ1dHRvbjsKLQkvL3ByaXZhdGUgQnV0dG9uIGdlbmVyYXRlQWxsQ2hlY2tCb3hCdXR0b247Ci0JcHJpdmF0ZSBDb21ibyBkYXRhYmluZGluZ1R5cGVDb21ibzsKLQlwcml2YXRlIENvbWJvIHBvcnROYW1lQ29tYm87Ci0JcHJpdmF0ZSBDb21ibyBzZXJ2aWNlTmFtZUNvbWJvOwotCXByaXZhdGUgVGV4dCBwYWNrYWdlVGV4dDsKLQkKLQkvL3ByaXZhdGUgamF2YS51dGlsLkxpc3Qgc2VydmljZVFOYW1lTGlzdDIgPSBudWxsOwotCXByaXZhdGUgVGFibGUgbmFtZXNwYWNlMnBhY2thZ2VUYWJsZSA9IG51bGw7Ci0JcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVBbGxDaGVja0JveEJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiB0ZXN0Q2FzZUNoZWNrQm94QnV0dG9uOwotCQotCXByaXZhdGUgV1NETFByb3BlcnR5UmVhZGVyIHJlYWRlcjsKLQlwcml2YXRlIExpc3Qgc2VydmljZVFOYW1lTGlzdCA9IG51bGw7Ci0JQXhpczJFbWl0dGVyQ29udGV4dCBjb250ZXh0OwotCi0KLQlwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyggQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIgKQotCXsKLQkJY29udGV4dCA9IFdlYlNlcnZpY2VBeGlzMkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEF4aXNFbWl0dGVyQ29udGV4dCgpOwotCQlVSVV0aWxzIHVpVXRpbHMgPSBuZXcgVUlVdGlscyhXZWJTZXJ2aWNlQXhpczJVSVBsdWdpbi5QTFVHSU5fSUQpOwotCQkKLQkJQ29tcG9zaXRlICB0b3BDb21wID0gdWlVdGlscy5jcmVhdGVDb21wb3NpdGUocGFyZW50LCAyICk7Ci0JCi0JCS8vIHNlcnZpY2UgbmFtZQotCQlzZXJ2aWNlTmFtZUNvbWJvID0gdWlVdGlscy5jcmVhdGVDb21ibyh0b3BDb21wLCBBeGlzMkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9TRVJWSUNFX05BTUVfQ0FQVElPTiwgbnVsbCwgbnVsbCwgU1dULlJFQURfT05MWSk7Ci0JCXNlcnZpY2VOYW1lQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vbG9hZFBvcnROYW1lcygpOwotCQkJCWludCBzZWxlY3Rpb25JbmRleCA9IHNlcnZpY2VOYW1lQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQlpZiAoc2VsZWN0aW9uSW5kZXggIT0gLTEpIHsKLQkJCQkJT2JqZWN0IG9iamVjdCA9IHJlYWRlci5nZXRTZXJ2aWNlTGlzdCgpLmdldChzZWxlY3Rpb25JbmRleCk7Ci0JCQkJCW1vZGVsLnNldFNlcnZpY2VRTmFtZShvYmplY3QpOwotCQkJCX0KLQkJCQlsb2FkUG9ydE5hbWVzKCk7Ci0JCQkJcG9wdWxhdGVQYWNrYWdlTmFtZSgpOwotCQkJCWxvYWROYW1lc3BhY2VzKHJlYWRlci5nZXREZWZpbml0aW9uTmFtZXNwYWNlTWFwKCkpOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gcG9ydCBuYW1lCi0JCXBvcnROYW1lQ29tYm8gPSB1aVV0aWxzLmNyZWF0ZUNvbWJvKHRvcENvbXAsIEF4aXMyQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX1BPUlROQU1FLCBudWxsLCBudWxsLCBTV1QuUkVBRF9PTkxZKTsKLQkJcG9ydE5hbWVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJbW9kZWwuc2V0UG9ydE5hbWUocG9ydE5hbWVDb21iby5nZXRUZXh0KCkpOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gRGF0YWJpbmRpbmcKLQkJZGF0YWJpbmRpbmdUeXBlQ29tYm8gPSB1aVV0aWxzLmNyZWF0ZUNvbWJvKHRvcENvbXAsIEF4aXMyQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX0RBVEFCSU5ESU5HX0NBUFRJT04sIG51bGwsIG51bGwsIFNXVC5SRUFEX09OTFkpOwotCQlmaWxsRGF0YWJpbmRlckNvbWJvKCk7Ci0JCWRhdGFiaW5kaW5nVHlwZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQltb2RlbC5zZXREYXRhYmluZGluZ1R5cGUoZGF0YWJpbmRpbmdUeXBlQ29tYm8uZ2V0VGV4dCgpKTsKLQkJCX07Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfTsKLQkJfSk7Ci0JCQotCQkvLyBwYWNrYWdlIG5hbWUKLQkJcGFja2FnZVRleHQgPSB1aVV0aWxzLmNyZWF0ZVRleHQodG9wQ29tcCwgQXhpczJDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfUEFDS0VHRV9OQU1FLCBudWxsLCBudWxsLFNXVC5CT1JERVIpOwotCQlwYWNrYWdlVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQltb2RlbC5zZXRQYWNrYWdlVGV4dChwYWNrYWdlVGV4dC5nZXRUZXh0KCkpOwotCQkJfQotCQl9KTsKLQkJCi0JICAJLy9DbGllbnQgdHlwZSBsYWJlbCAKLQkJR3JvdXAgY2xpZW50VHlwZUdyb3VwID0gdWlVdGlscy5jcmVhdGVHcm91cChwYXJlbnQsIEF4aXMyQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX0NMSUVOVF9TSURFLCBudWxsLCBudWxsKTsKLQkJCQkKLQkJc3luY0FuZEFzeW5jUmFkaW9CdXR0b24gPSB1aVV0aWxzLmNyZWF0ZVJhZGlvQnV0dG9uKGNsaWVudFR5cGVHcm91cCwgQXhpczJDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfU1lOQ19BTkRfQVNZTkMsIG51bGwsIG51bGwpOwotCQlzeW5jQW5kQXN5bmNSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24oCi0JCQkJKChjb250ZXh0LmlzQXN5bmMoKSB8fCBjb250ZXh0LmlzU3luYygpKT09ZmFsc2UpCi0JCQkJP3RydWUKLQkJCQk6KGNvbnRleHQuaXNBc3luYygpICYmIGNvbnRleHQuaXNTeW5jKCkpKTsKLQkJc3luY0FuZEFzeW5jUmFkaW9CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vQmVjYXVzZSBkZWZhdWx0IHNldHRpbmcgaW4gYXhpczIgdG8gYmUgYm90aCBmYWxzZSBpbiB0aGllIGNhc2UKLQkJCQkvL0ZpbGUgYSBKSVJBIHRvIGZpeCB0aGlzLgotCQkJCW1vZGVsLnNldFN5bmMoIXN5bmNBbmRBc3luY1JhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJCQltb2RlbC5zZXRBU3luYyghc3luY0FuZEFzeW5jUmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJc3luY09ubHlSYWRpb0J1dHRvbiA9IHVpVXRpbHMuY3JlYXRlUmFkaW9CdXR0b24oY2xpZW50VHlwZUdyb3VwLCBBeGlzMkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9TWU5DLCBudWxsLCBudWxsKTsKLQkJc3luY09ubHlSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc1N5bmMoKSAmJiAhY29udGV4dC5pc0FzeW5jKCkpOwotCQlzeW5jT25seVJhZGlvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQltb2RlbC5zZXRTeW5jKHN5bmNPbmx5UmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQkJCW1vZGVsLnNldEFTeW5jKCFzeW5jT25seVJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCWFzeW5jT25seVJhZGlvQnV0dG9uID0gdWlVdGlscy5jcmVhdGVSYWRpb0J1dHRvbihjbGllbnRUeXBlR3JvdXAsIEF4aXMyQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkxBQkVMX0FTWU5DLCBudWxsLCBudWxsKTsKLQkJYXN5bmNPbmx5UmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNBc3luYygpICYmICFjb250ZXh0LmlzU3luYygpKTsKLQkJYXN5bmNPbmx5UmFkaW9CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW1vZGVsLnNldEFTeW5jKGFzeW5jT25seVJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJCQltb2RlbC5zZXRTeW5jKCFhc3luY09ubHlSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQkJCi0JCS8vU2V0IHRoZSBzeW5jIGFzeW5jIHRvIGRlZmF1bHQgCi0JCW1vZGVsLnNldFN5bmMoY29udGV4dC5pc1N5bmMoKSk7Ci0JCW1vZGVsLnNldEFTeW5jKGNvbnRleHQuaXNBc3luYygpKTsKLQkJCi0JICAgCS8vIGdlbmVyYXRlIHRlc3QgY2FzZSBvcHRpb24KLQkJCi0JCUNvbXBvc2l0ZSBjaGVja0JveGVzID0gdWlVdGlscy5jcmVhdGVDb21wb3NpdGUocGFyZW50LCAxKTsKLQkJdGVzdENhc2VDaGVja0JveEJ1dHRvbiA9IHVpVXRpbHMuY3JlYXRlQ2hlY2tib3goY2hlY2tCb3hlcywgQXhpczJDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfR0VORVJBVEVfVEVTVENBU0VfQ0FQVElPTiwgbnVsbCwgbnVsbCk7Ci0JCXRlc3RDYXNlQ2hlY2tCb3hCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNDbGllbnRUZXN0Q2FzZSgpKTsKLQkJbW9kZWwuc2V0VGVzdENhc2VDaGVjayhjb250ZXh0LmlzQ2xpZW50VGVzdENhc2UoKSk7Ci0JCXRlc3RDYXNlQ2hlY2tCb3hCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW1vZGVsLnNldFRlc3RDYXNlQ2hlY2sodGVzdENhc2VDaGVja0JveEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCi0JCS8vIGdlbmVyYXRlIGFsbAotCQlnZW5lcmF0ZUFsbENoZWNrQm94QnV0dG9uID0gdWlVdGlscy5jcmVhdGVDaGVja2JveChjaGVja0JveGVzLCBBeGlzMkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9HRU5FUkFURV9BTEwsIG51bGwsIG51bGwpOwotCQlnZW5lcmF0ZUFsbENoZWNrQm94QnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzQ2xpZW50R2VuZXJhdGVBbGwoKSk7Ci0JCWdlbmVyYXRlQWxsQ2hlY2tCb3hCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW1vZGVsLnNldEdlbmVyYXRlQWxsQ2hlY2soZ2VuZXJhdGVBbGxDaGVja0JveEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCSAgIAotCSAgICBuZXcgTGFiZWwocGFyZW50LFNXVC5IT1JJWk9OVEFMKTsKLSAgICAgICAgbmFtZXNwYWNlMnBhY2thZ2VUYWJsZSA9IG5ldyBUYWJsZShwYXJlbnQsU1dULkJPUkRFUnxTV1QuRlVMTF9TRUxFQ1RJT04pOwotICAgICAgICBuYW1lc3BhY2UycGFja2FnZVRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLSAgICAgICAgbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOyAKLSAgICAgICAgbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAKLSAgICAgICAgZGVjbGFyZUNvbHVtbihuYW1lc3BhY2UycGFja2FnZVRhYmxlLAotICAgICAgICAJCTM1MCwgLy9hIGRlZmF1bHQgd2lkdGggdW50aWwgd2UgYWRqdXN0Ci0gICAgICAgIAkJQXhpczJDb25zdW1wdGlvblVJTWVzc2FnZXMuTEFCRUxfTkFNRVNQQUNFKTsKLSAgICAgICAgZGVjbGFyZUNvbHVtbihuYW1lc3BhY2UycGFja2FnZVRhYmxlLAotICAgICAgICAJCTIwMCwvL2EgZGVmYXVsdCB3aWR0aCB1bnRpbCB3ZSBhZGp1c3QKLSAgICAgICAgCQlBeGlzMkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9QQUNLQUdFKTsKLSAgICAgICAgCi0gICAgICAgIG5hbWVzcGFjZTJwYWNrYWdlVGFibGUuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGFkZCB0aGUgdGFibGUgZWRpdG9yCi0gICAgICAgIGZpbmFsIFRhYmxlRWRpdG9yIGVkaXRvciA9IG5ldyBUYWJsZUVkaXRvcihuYW1lc3BhY2UycGFja2FnZVRhYmxlKTsKLSAgICAgICAgZWRpdG9yLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuTEVGVDsKLSAgICAgICAgZWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQotICAgICAgICBuYW1lc3BhY2UycGFja2FnZVRhYmxlLmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvd24sIG5ldyBMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgIFJlY3RhbmdsZSBjbGllbnRBcmVhID0gbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5nZXRDbGllbnRBcmVhKCk7Ci0gICAgICAgICAgICAgIFBvaW50IHB0ID0gbmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpOwotICAgICAgICAgICAgICBpbnQgaW5kZXggPSBuYW1lc3BhY2UycGFja2FnZVRhYmxlLmdldFRvcEluZGV4KCk7Ci0gICAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IG5hbWVzcGFjZTJwYWNrYWdlVGFibGUuZ2V0SXRlbUNvdW50KCkpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHZpc2libGUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBUYWJsZUl0ZW0gaXRlbSA9IG5hbWVzcGFjZTJwYWNrYWdlVGFibGUuZ2V0SXRlbShpbmRleCk7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFJlY3RhbmdsZSByZWN0ID0gaXRlbS5nZXRCb3VuZHMoMSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlY3QuY29udGFpbnMocHQpKSB7Ci0gICAgICAgICAgICAgICAgCWVkaXRDZWxsKGl0ZW0sIGVkaXRvcik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCF2aXNpYmxlICYmIHJlY3QuaW50ZXJzZWN0cyhjbGllbnRBcmVhKSkgewotICAgICAgICAgICAgICAgICAgICB2aXNpYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCF2aXNpYmxlKQotICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIG5hbWVzcGFjZTJwYWNrYWdlVGFibGUuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJaWYgKG5hbWVzcGFjZTJwYWNrYWdlVGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSAtMSkKLQkJCQkJbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5zZXRTZWxlY3Rpb24oMCk7Ci0JCQl9Ci0gICAgICAgIH0pOwotICAgICAgICAKLSAgICAgICAgbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLSAgICAgICAgCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewkJCQotICAgICAgICAJCWlmIChlLmtleUNvZGUgIT0gMzIpCi0gICAgICAgIAkJCXJldHVybjsKLQkJCQkJCQkJCi0gICAgICAgIAkJVGFibGVJdGVtW10gaXRlbSA9IG5hbWVzcGFjZTJwYWNrYWdlVGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKGl0ZW0ubGVuZ3RoICE9IDEpCi0JCQkJCXJldHVybjsKLQkJCQkJCi0JCQkJZWRpdENlbGwoaXRlbVswXSwgZWRpdG9yKTsJCQkJCQkJCQkJCQkJCQkKLQkJCX0KLSAgICAgICAgfSk7ICAgICAgICAKLQotLy8JCVVJVXRpbHMgICAgICB1aVV0aWxzICA9IG5ldyBVSVV0aWxzKCBwbHVnaW5JZF8gKTsKLS8vCQlwYXJlbnQuc2V0VG9vbFRpcFRleHQoIEF4aXMyQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlRPT0xUSVBfUFBBRV9QQUdFICk7Ci0vLwkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCggcGFyZW50LCBwbHVnaW5JZF8gKyAiLiIgKyAgdGhpcy5wbHVnaW5JZF8pOwotCQkKLQkJcG9wdWxhdGVQYXJhbXNGcm9tV1NETCgpOwotCQlwb3B1bGF0ZU1vZGVsKCk7Ci0KLQkJcmV0dXJuIHRoaXM7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBlZGl0Q2VsbChmaW5hbCBUYWJsZUl0ZW0gaXRlbSwgVGFibGVFZGl0b3IgZWRpdG9yKSB7Ci0JCQotCQlmaW5hbCBUZXh0IHRleHRFZGl0ID0gbmV3IFRleHQobmFtZXNwYWNlMnBhY2thZ2VUYWJsZSwgU1dULk5PTkUpOwkJCi0JCXRleHRFZGl0LnNldFRleHQoaXRlbS5nZXRUZXh0KDEpKTsJCQkJCQkKLQkJdGV4dEVkaXQuc2VsZWN0QWxsKCk7Ci0JCXRleHRFZGl0LnNldEZvY3VzKCk7Ci0JCQotCQl0ZXh0RWRpdC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJaXRlbS5zZXRUZXh0KDEsIHRleHRFZGl0LmdldFRleHQoKSk7Ci0JCQkJdGV4dEVkaXQuZGlzcG9zZSgpOwotCQkJfQkJCQotCQl9KTsKLQkJCi0JCXRleHRFZGl0LmFkZFRyYXZlcnNlTGlzdGVuZXIobmV3IFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0JCQkJc3dpdGNoIChlLmRldGFpbCkgewotCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9SRVRVUk46Ci0JCQkJCQlpdGVtLnNldFRleHQoMSwgdGV4dEVkaXQuZ2V0VGV4dCgpKTsKLQkJCQkJY2FzZSBTV1QuVFJBVkVSU0VfRVNDQVBFOgotCQkJCQkJdGV4dEVkaXQuZGlzcG9zZSgpOwotCQkJCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJfQotCQkJfQkJCQotCQl9KTsKLQkJCi0JCXRleHRFZGl0LmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQkJaWYgKGUua2V5Q29kZSA9PSAzMikgewotCQkJCQlpdGVtLnNldFRleHQoMSwgdGV4dEVkaXQuZ2V0VGV4dCgpKTsKLQkJCQkJdGV4dEVkaXQuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0JCQkKLQkJfSk7Ci0JCQotCQl0ZXh0RWRpdC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQkJbW9kZWwuc2V0TmFtZXNwYXNlVG9QYWNrYWdlTWFwcGluZyhnZXROczJQa2dNYXBwaW5nKCkpOwkJCQkKLQkJCX0JCQkKLQkJfSk7Ci0JCQotCQllZGl0b3Iuc2V0RWRpdG9yKHRleHRFZGl0LCBpdGVtLCAxKTsKLQl9Ci0JCi0JLyoqCi0JICogQSB1dGlsIG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgY29sdW1uCi0JICogQHBhcmFtIHRhYmxlCi0JICogQHBhcmFtIHdpZHRoCi0JICogQHBhcmFtIGNvbE5hbWUKLQkgKi8KLQlwcml2YXRlIHZvaWQgZGVjbGFyZUNvbHVtbihUYWJsZSB0YWJsZSwgaW50IHdpZHRoLFN0cmluZyBjb2xOYW1lKXsKLSAgICAgICAgVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLFNXVC5OT05FKTsKLSAgICAgICAgY29sdW1uLnNldFdpZHRoKHdpZHRoKTsKLSAgICAgICAgY29sdW1uLnNldFRleHQoY29sTmFtZSk7Ci0gICAgfQotCQotCS8qKgotCSAqIGdldCB0aGUgcGFja2FnZSB0byBuYW1lc3BhY2UgbWFwcGluZ3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROczJQa2dNYXBwaW5nKCl7Ci0JCVN0cmluZyByZXR1cm5MaXN0PSIiOwotCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IG5hbWVzcGFjZTJwYWNrYWdlVGFibGUuZ2V0SXRlbXMoKTsKLQkJU3RyaW5nIHBhY2thZ2VWYWx1ZTsgCi0JCWZvciAoaW50IGk9MDtpPGl0ZW1zLmxlbmd0aDtpKyspewotCQkJcGFja2FnZVZhbHVlID0gaXRlbXNbaV0uZ2V0VGV4dCgxKTsKLQkJCWlmIChwYWNrYWdlVmFsdWUhPW51bGwgJiYgISIiLmVxdWFscyhwYWNrYWdlVmFsdWUpKXsKLQkJCQlyZXR1cm5MaXN0ID0gcmV0dXJuTGlzdCArCi0JCQkJICAgICAgICAgICAgICgiIi5lcXVhbHMocmV0dXJuTGlzdCk/IiI6IiwiKSArCi0JCQkJICAgICAgICAgICAgIGl0ZW1zW2ldLmdldFRleHQoMCkrICI9IiArIHBhY2thZ2VWYWx1ZTsKLQkJCX0KLQkJCQotCQl9Ci0JCXJldHVybiAiIi5lcXVhbHMocmV0dXJuTGlzdCk/bnVsbDpyZXR1cm5MaXN0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzR2VuUHJveHkoKQl7Ci0JCS8vYm9vbGVhbiBlbmFibGVkID0gZ2VuUHJveHlDaGVja2JveF8uZ2V0U2VsZWN0aW9uKCk7Ci0JCXJldHVybiB0cnVlOyAvL2Fsd2F5cwotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0R2VuZXJhdGVQcm94eSggQm9vbGVhbiBnZW5Qcm94eSApewotCQlnZW5Qcm94eUNoZWNrYm94Xy5zZXRTZWxlY3Rpb24oIGdlblByb3h5LmJvb2xlYW5WYWx1ZSgpICk7Ci0JfSAgIAotCQotCS8qKgotCSAqIEZpbGwgdGhlIGNvbWJvIHdpdGggcHJvcGVyIGRhdGFiaW5kaW5nIG5hbWVzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpbGxEYXRhYmluZGVyQ29tYm8oKSB7Ci0JCWRhdGFiaW5kaW5nVHlwZUNvbWJvLmFkZChBeGlzMkNvbnN0YW50cy5EQVRBX0JJTkRJTkdfQURCKTsKLQkJZGF0YWJpbmRpbmdUeXBlQ29tYm8uYWRkKEF4aXMyQ29uc3RhbnRzLkRBVEFfQklORElOR19YTUxCRUFOUyk7Ci0JCWRhdGFiaW5kaW5nVHlwZUNvbWJvLmFkZChBeGlzMkNvbnN0YW50cy5EQVRBX0JJTkRJTkdfTk9ORSk7Ci0JCWludCBzZWxlY3RlZCA9IGRhdGFiaW5kaW5nVHlwZUNvbWJvLmluZGV4T2YoY29udGV4dC5nZXRDbGllbnREYXRhYmluZGluZygpLnRvVXBwZXJDYXNlKCkpOwotCQlpZiAoc2VsZWN0ZWQ9PS0xKQotCQkJZGF0YWJpbmRpbmdUeXBlQ29tYm8uc2VsZWN0KDApOwotCQllbHNlCi0JCQlkYXRhYmluZGluZ1R5cGVDb21iby5zZWxlY3Qoc2VsZWN0ZWQpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVNb2RlbCgpIHsKLQkJaW50IHNlbGVjdGlvbkluZGV4ID0gc2VydmljZU5hbWVDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoc2VsZWN0aW9uSW5kZXggIT0gLTEpIHsKLQkJCU9iamVjdCBvYmplY3QgPSByZWFkZXIuZ2V0U2VydmljZUxpc3QoKS5nZXQoc2VsZWN0aW9uSW5kZXgpOwotCQkJbW9kZWwuc2V0U2VydmljZVFOYW1lKG9iamVjdCk7Ci0JCX0KLQkJbW9kZWwuc2V0UG9ydE5hbWUocG9ydE5hbWVDb21iby5nZXRUZXh0KCkpOwotCQltb2RlbC5zZXRQYWNrYWdlVGV4dChwYWNrYWdlVGV4dC5nZXRUZXh0KCkpOwotCQltb2RlbC5zZXREYXRhYmluZGluZ1R5cGUoZGF0YWJpbmRpbmdUeXBlQ29tYm8uZ2V0VGV4dCgpKTsKLQkJLy9tb2RlbC5zZXRBU3luYyhhc3luY09ubHlSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCS8vbW9kZWwuc2V0U3luYyhzeW5jT25seVJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJaWYgKHN5bmNBbmRBc3luY1JhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKXsKLQkJCW1vZGVsLnNldEFTeW5jKCFzeW5jQW5kQXN5bmNSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCQltb2RlbC5zZXRTeW5jKCFzeW5jQW5kQXN5bmNSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0KLQkJbW9kZWwuc2V0R2VuZXJhdGVBbGxDaGVjayhnZW5lcmF0ZUFsbENoZWNrQm94QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJbW9kZWwuc2V0VGVzdENhc2VDaGVjayh0ZXN0Q2FzZUNoZWNrQm94QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJbW9kZWwuc2V0TmFtZXNwYXNlVG9QYWNrYWdlTWFwcGluZyhnZXROczJQa2dNYXBwaW5nKCkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yI2dldFN0YXR1cygpCi0JICovCi0JcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkgCi0JewotCQlJU3RhdHVzIHJlc3VsdCA9IG51bGw7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlUGFja2FnZU5hbWUoKSB7Ci0JCXRoaXMucGFja2FnZVRleHQuc2V0VGV4dChyZWFkZXIucGFja2FnZUZyb21UYXJnZXROYW1lc3BhY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogcG9wdWxhdGUgdGhlIHNlcnZpY2UgYW5kIHRoZSBwb3J0IGZyb20gdGhlIFdTREwgdGhpcyBuZWVkcyB0byBiZSBwdWJsaWMKLQkgKiBzaW5jZSB0aGUgV1NETHNlbGVjdGlvbiBwYWdlIG1heSBjYWxsIHRoaXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBwb3B1bGF0ZVBhcmFtc0Zyb21XU0RMKCkgewotCQlpZiAocmVhZGVyID09IG51bGwpCi0JCQlyZWFkZXIgPSBuZXcgV1NETFByb3BlcnR5UmVhZGVyKG1vZGVsKTsKLQkJdHJ5IHsKLQkJCVN0cmluZyBsbmFtZSA9IG1vZGVsLmdldFdzZGxVUkkoKTsKLQkJCWlmICghIiIuZXF1YWxzKGxuYW1lLnRyaW0oKSkpIHsKLQotCQkJCXJlYWRlci5yZWFkV1NETChtb2RlbC5nZXRXZWJQcm9qZWN0TmFtZSgpLCBsbmFtZSk7Ci0KLQkJCQl0aGlzLnNlcnZpY2VRTmFtZUxpc3QgPSByZWFkZXIuZ2V0U2VydmljZUxpc3QoKTsKLQkJCQlpZiAoIXNlcnZpY2VRTmFtZUxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCXNlcnZpY2VOYW1lQ29tYm8ucmVtb3ZlQWxsKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZVFOYW1lTGlzdC5zaXplKCk7IGkrKykgewotCQkJCQkJLy8gYWRkIHRoZSBsb2NhbCBwYXJ0IG9mIHRoZQotCQkJCQkJT2JqZWN0IHNlcnZpY2VRbmFtZUluc3RhbmNlID0gc2VydmljZVFOYW1lTGlzdC5nZXQoaSk7Ci0JCQkJCQlDbGFzcyBRTmFtZUNsYXNzID0gQ2xhc3NMb2FkaW5nVXRpbAotCQkJCQkJCQkubG9hZENsYXNzRnJvbUFudENsYXNzTG9hZGVyKCJqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIik7Ci0JCQkJCQlNZXRob2QgR2V0TG9jYWxQYXJ0TWV0aG9kICA9IFFOYW1lQ2xhc3MuZ2V0TWV0aG9kKCJnZXRMb2NhbFBhcnQiLCBudWxsKTsKLQkJCQkJCU9iamVjdCByZXN1bHRMb2NhbFBhcnQgPSBHZXRMb2NhbFBhcnRNZXRob2QKLQkJCQkJCQkJCQkuaW52b2tlKHNlcnZpY2VRbmFtZUluc3RhbmNlLCBudWxsKTsKLQkJCQkJCXNlcnZpY2VOYW1lQ29tYm8uYWRkKHJlc3VsdExvY2FsUGFydC50b1N0cmluZygpKTsKLQkJCQkJfQotCQkJCQk7Ci0JCQkJCS8vIHNlbGVjdCB0aGUgZmlyc3Qgb25lIGFzIHRoZSBkZWZhdWx0Ci0JCQkJCXNlcnZpY2VOYW1lQ29tYm8uc2VsZWN0KDApOwotCi0JCQkJCS8vIGxvYWQgdGhlIHBvcnRzCi0JCQkJCWxvYWRQb3J0TmFtZXMoKTsKLQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIHNlcnZpY2UgbmFtZSBsaXN0IGJlaW5nIGVtcHR5IG1lYW5zIHdlIGFyZSBzd2l0Y2hpbmcgdG8KLQkJCQkJLy8gdGhlIGludGVyZmFjZSBtb2RlCi0JCQkJCWlmIChzZXJ2aWNlTmFtZUNvbWJvIT1udWxsKSBzZXJ2aWNlTmFtZUNvbWJvLnJlbW92ZUFsbCgpOwotCQkJCQlpZiAocG9ydE5hbWVDb21ibyE9bnVsbCkgcG9ydE5hbWVDb21iby5yZW1vdmVBbGwoKTsKLQotCQkJCX0KLQotCQkJCXBvcHVsYXRlUGFja2FnZU5hbWUoKTsKLQotCQkJCS8vcG9wdWxhdGUgdGhlIG5hbWVzcGFjZXNzCi0JCQkJbG9hZE5hbWVzcGFjZXMocmVhZGVyLmdldERlZmluaXRpb25OYW1lc3BhY2VNYXAoKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyhOTFMuYmluZCgKLQkJCQkJQXhpczJDb25zdW1wdGlvblVJTWVzc2FnZXMuRVJST1JfSU5WQUxJRF9XU0RMX0ZJTEVfUkVBRF9XUklURUwsCi0JCQkJCW5ldyBTdHJpbmdbXXtlLmdldExvY2FsaXplZE1lc3NhZ2UoKX0pLCBlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBMb2FkcyB0aGUgbmFtZXNwYWNlcwotCSAqIEBwYXJhbSBuYW1lc3BhY2VNYXAKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZE5hbWVzcGFjZXMoTWFwIG5hbWVzcGFjZU1hcCl7Ci0JCUl0ZXJhdG9yIG5hbWVzcGFjZXMgPSBuYW1lc3BhY2VNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5yZW1vdmVBbGwoKTsKLSAgICAgICAgVGFibGVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVJdGVtW25hbWVzcGFjZU1hcC5zaXplKCldOyAvLyBBbiBpdGVtIGZvciBlYWNoIGZpZWxkCi0gICAgICAgIAotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIHdoaWxlKG5hbWVzcGFjZXMuaGFzTmV4dCgpKXsKLSAgICAgICAgCQotICAgICAgICAgICBpdGVtc1tpXSA9IG5ldyBUYWJsZUl0ZW0obmFtZXNwYWNlMnBhY2thZ2VUYWJsZSwgU1dULk5VTEwpOwotICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gKFN0cmluZyluYW1lc3BhY2VzLm5leHQoKTsKLSAgICAgICAgICAgaXRlbXNbaV0uc2V0VGV4dCgwLG5hbWVzcGFjZSk7Ci0gICAgICAgICAgIGl0ZW1zW2ldLnNldFRleHQoMSxnZXRQYWNrYWdlRnJvbU5hbWVzcGFjZShuYW1lc3BhY2UpKTsKLSAgICAgICAgICAgaSsrOwotICAgICAgICB9Ci0KLSAgICAgICAgbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5zZXRWaXNpYmxlKHRydWUpOwotCQkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9hZFBvcnROYW1lcygpIHsKLQkJaW50IHNlbGVjdGlvbkluZGV4ID0gc2VydmljZU5hbWVDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoc2VsZWN0aW9uSW5kZXggIT0gLTEpIHsKLQkJCWphdmEudXRpbC5MaXN0IHBvcnRzID0gcmVhZGVyLmdldFBvcnROYW1lTGlzdCggc2VydmljZVFOYW1lTGlzdAotCQkJCQkuZ2V0KHNlbGVjdGlvbkluZGV4KSk7Ci0JCQlpZiAoIXBvcnRzLmlzRW1wdHkoKSkgewotCQkJCXBvcnROYW1lQ29tYm8ucmVtb3ZlQWxsKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwb3J0cy5zaXplKCk7IGkrKykgewotCQkJCQkvLyBhZGQgdGhlIGxvY2FsIHBhcnQgb2YgdGhlCi0JCQkJCXBvcnROYW1lQ29tYm8uYWRkKHBvcnRzLmdldChpKS50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQkJcG9ydE5hbWVDb21iby5zZWxlY3QoMCk7Ci0JCQkJbW9kZWwuc2V0UG9ydE5hbWUocG9ydE5hbWVDb21iby5nZXRUZXh0KCkpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBlcnJvciBubyBwb3J0cyBmb3VuZAotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgcGFja2FnZSBkZXJpdmVkIGJ5ICBOYW1lc3BhY2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VGcm9tTmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpewotCQkvLyBVc2UgcmVmbGVjdGlvbiB0byBpbnZva2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsLlVSTFByb2Nlc3NvciAKLQkJLy8gbWFrZVBhY2thZ2VOYW1lKG5hbWVzcGFjZSkgc3RhdGljYWxseQotCQlPYmplY3Qgc3RyaW5nUmV0dXJuID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUNsYXNzIFVSTFByb2Nlc3NvckNsYXNzID0gQ2xhc3NMb2FkaW5nVXRpbAotCQkJCQkubG9hZENsYXNzRnJvbUFudENsYXNzTG9hZGVyKCJvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVVJMUHJvY2Vzc29yIik7Ci0JCQlNZXRob2QgbWFrZVBhY2thZ2VOYW1lTWV0aG9kID0gVVJMUHJvY2Vzc29yQ2xhc3MKLQkJCQkJLmdldE1ldGhvZCgibWFrZVBhY2thZ2VOYW1lIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzfSk7Ci0JCQlzdHJpbmdSZXR1cm4gPSBtYWtlUGFja2FnZU5hbWVNZXRob2QuaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXXtuYW1lc3BhY2V9KTsKLQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gIChTdHJpbmcpc3RyaW5nUmV0dXJuOwotCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMyL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9jbGllbnQvV2ViU2VydmljZUNsaWVudEF4aXMyVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzMi9jb25zdW1wdGlvbi91aS93aXphcmQvY2xpZW50L1dlYlNlcnZpY2VDbGllbnRBeGlzMlR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBjZmY2OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMyL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9jbGllbnQvV2ViU2VydmljZUNsaWVudEF4aXMyVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDEzMCAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiAKLSAqIAkJCQkJCQkJCQkgIHJ1bnRpbWUgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzYyCi0gKiAyMDA3MDQyNiAgIDE4MzA0NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMyLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS5kYXRhLkRhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS5tZXNzYWdlcy5BeGlzMkNvbnN1bXB0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpczIuY29uc3VtcHRpb24udWkud2lkZ2V0cy5BeGlzMlByb3h5V2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5TaW1wbGVGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnk7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlQ2xpZW50QXhpczJUeXBlIGltcGxlbWVudHMgQ29tbWFuZFdpZGdldEJpbmRpbmcgewotCQotCURhdGFNb2RlbCBtb2RlbDsKLQkKLQlwdWJsaWMgV2ViU2VydmljZUNsaWVudEF4aXMyVHlwZShEYXRhTW9kZWwgbW9kZWwpewotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JfQotCi0JCi0JICAvKiAobm9uLUphdmFkb2MpCi0JICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyRGF0YU1hcHBpbmdzCi0JICAgKiAob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5KQotCSAgICovCi0JICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkgewotCSAgCS8vIEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZCAgCQotCSAgICAvLyBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQXhpczJDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgCi0JCS8vICJDdXN0b21pemVDbGllbnRNYXBwaW5ncyIsIEF4aXMyUHJveHlXaWRnZXQuY2xhc3MgKTsKLQkgICAgCi0JICB9Ci0JICAKLQkgIC8qIChub24tSmF2YWRvYykKLQkgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJXaWRnZXRNYXBwaW5ncwotCSAgICogKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5KQotCSAgICovCi0JICBwdWJsaWMgdm9pZCByZWdpc3RlcldpZGdldE1hcHBpbmdzKFdpZGdldFJlZ2lzdHJ5IHdpZGdldFJlZ2lzdHJ5KSB7Ci0JICAgCi0JICAgIHdpZGdldFJlZ2lzdHJ5LmFkZCggIkF4aXNDbGllbnRTdGFydCIsIAotCSAgICAgICAgQXhpczJDb25zdW1wdGlvblVJTWVzc2FnZXMuUEFHRV9USVRMRV9XU19BWElTMl9QUk9YWSwKLQkgICAgICAgIEF4aXMyQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlBBR0VfREVTQ19XU19BWElTMl9QUk9YWSwKLQkgICAgICAgIG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKQotCSAgICAgICAgewotCSAgICAgICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkKLQkgICAgICAgICAgewotCSAgICAgICAgICAgIHJldHVybiBuZXcgQXhpczJQcm94eVdpZGdldChtb2RlbCk7Ci0JICAgICAgICAgIH0KLQkgICAgICAgIH0gKTsKLQkgICAgCi0JICAgIC8vd2lkZ2V0UmVnaXN0cnkuYWRkKCAiQXhpc0NsaWVudEJlYW5NYXBwaW5nIiwgCi0JICAgIC8vICAgIEF4aXMyQ29uc3VtcHRpb25VSU1lc3NhZ2VzLlBBR0VfVElUTEVfV1NfWE1MMlBST1hZLAotCSAgICAvLyAgICBBeGlzMkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9FWFBMT1JFX01BUFBJTkdTX1hNTDJCRUFOLAotCSAgICAvLyAgICBuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkKLQkgICAgLy8gICAgewotCSAgICAvLyAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKQotCSAgICAvLyAgICAgIHsKLQkgICAgLy8gICAgICAgIHJldHVybiBuZXcgQXhpc01hcHBpbmdzV2lkZ2V0KEF4aXNNYXBwaW5nc1dpZGdldC5NT0RFX1hNTDJQUk9YWSApOwotCSAgICAvLyAgICAgIH0KLQkgICAgLy8gICAgfSApOwotCSAgfQotCSAgCi0JICAvKiAobm9uLUphdmFkb2MpCi0JICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50Ci0JICAgKiAuQ29tbWFuZEZyYWdtZW50RmFjdG9yeUZhY3RvcnkjY3JlYXRlKCkKLQkgICAqLwotCSAgcHVibGljIENvbW1hbmRGcmFnbWVudEZhY3RvcnkgY3JlYXRlKCkgCi0JICB7Ci0JICAgIHJldHVybiBuZXcgQ29tbWFuZEZyYWdtZW50RmFjdG9yeSgpCi0JICAgICAgICAgICB7Ci0JICAgICAgICAgICAgIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgY3JlYXRlKCkKLQkgICAgICAgICAgICAgewotCSAgICAgICAgICAgICAgIC8vZGVhZCBjb2RlIC0gZG9lc24ndCBtYXR0ZXIgd2hhdCBnZXRzIHJldHVybmVkIGhlcmUuCi0JICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVGcmFnbWVudCgpOwotCSAgICAgICAgICAgICB9Ci0JICAgICAgICAgICB9OwotCSAgfQotCSAgLyogKG5vbi1KYXZhZG9jKQotCSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckNhbkZpbmlzaAotCSAgICogKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5KQotCSAgICovCi0JICBwdWJsaWMgdm9pZCByZWdpc3RlckNhbkZpbmlzaChDYW5GaW5pc2hSZWdpc3RyeSBjYW5GaW5pc2hSZWdpc3RyeSl7Ci0JICB9Ci0JICAKLQkgIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VEYXRhTW9kZWwoIERhdGFNb2RlbCBtb2RlbCApewotCQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzMi9jb25zdW1wdGlvbi91aS93c3J0L0F4aXMyQ2xpZW50Q29uZmlnV2lkZ2V0RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzMi9jb25zdW1wdGlvbi91aS93c3J0L0F4aXMyQ2xpZW50Q29uZmlnV2lkZ2V0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDE0NzFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpczIvY29uc3VtcHRpb24vdWkvd3NydC9BeGlzMkNsaWVudENvbmZpZ1dpZGdldEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDIzMCAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiAKLSAqIAkJCQkJCQkJCQkgIHJ1bnRpbWUgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzYyCi0gKiAyMDA3MDQyNiAgIDE4MzA0NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKiAyMDA3MDYwMSAgIDE5MDUwNSBwbW9vZ2tAY2EuaWJtLmNvbSAtIFBldGVyIE1vb2drCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMyLmNvbnN1bXB0aW9uLnVpLndzcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS5jb21tYW5kLkF4aXMyQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUuZGF0YS5EYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMyLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQXhpczJQcm94eVdpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpczIuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5XZWJTZXJ2aWNlQ2xpZW50QXhpczJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5JTmFtZWRXaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5JTmFtZWRXaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0QmluZGluZ1RvV2lkZ2V0RmFjdG9yeUFkYXB0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBBeGlzMkNsaWVudENvbmZpZ1dpZGdldEZhY3RvcnkgaW1wbGVtZW50cyBJTmFtZWRXaWRnZXRDb250cmlidXRvckZhY3Rvcnl7Ci0JcHJpdmF0ZSBJTmFtZWRXaWRnZXRDb250cmlidXRvciAgICAgICAgICAgICBwcm94eUNvbmZpZ1dpZGdldDsKLQlwcml2YXRlIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yICAgICAgICAgICAgIG1hcHBpbmdzV2lkZ2V0OwotCXByaXZhdGUgQXhpczJQcm94eVdpZGdldCAgICAgICAgICAgICAgICAgICAgIHByb3h5V2lkZ2V0OwotCXByaXZhdGUgV2lkZ2V0QmluZGluZ1RvV2lkZ2V0RmFjdG9yeUFkYXB0ZXIgYWRhcHRlcjsKLQlwcml2YXRlIERhdGFNb2RlbCAJCQkJCQkJbW9kZWw7Ci0JcHJpdmF0ZSBXZWJTZXJ2aWNlQ2xpZW50QXhpczJUeXBlICAgICAgICAgICB3c0NsaWVudEF4aXMyVHlwZTsKLQlwcml2YXRlIERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5OwotCQotCXB1YmxpYyBBeGlzMkNsaWVudENvbmZpZ1dpZGdldEZhY3RvcnkoKXsKLQl9Ci0JCi0JcHVibGljIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIGdldEZpcnN0TmFtZWRXaWRnZXQoKSB7Ci0JCWluaXQoKTsKLQkJLy93c0NsaWVudEF4aXMyVHlwZS5zZXRXZWJTZXJ2aWNlRGF0YU1vZGVsKG1vZGVsKTsKLQkJcmV0dXJuIHByb3h5Q29uZmlnV2lkZ2V0OwotCX0KLQotCXB1YmxpYyBJTmFtZWRXaWRnZXRDb250cmlidXRvciBnZXROZXh0TmFtZWRXaWRnZXQoIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIHdpZGdldENvbnRyaWJ1dG9yKSB7Ci0JICByZXR1cm4gd2lkZ2V0Q29udHJpYnV0b3IgPT0gcHJveHlDb25maWdXaWRnZXQgJiYgcHJveHlXaWRnZXQuaXNHZW5Qcm94eSgpIAotCSAgCQkJCQkJCQk/IG1hcHBpbmdzV2lkZ2V0IAotCSAgCQkJCQkJCQk6IG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KSB7Ci0JCXRoaXMuZGF0YVJlZ2lzdHJ5PWRhdGFSZWdpc3RyeTsKLQkJLy8gTWFwIHRoZSBkYXRhIG1vZGVsIGZyb20gdGhlIGRlZmF1bHRpbmcgY29tbWFuZCB0byB0aGlzIHdpZGdldCBmYWN0b3J5LgotCQkvLyBUaGUgZnJhbWV3b3JrIHdpbGwgYWN0dWFsbHkgdG8gdGhlIGNhbGwgdG8gZ2V0V2ViU2VydmljZURhdGFNb2RlbCBpbgotCQkvLyB0aGUgRXhhbXBsZURlZmF1bHRpbmdDb21tYW5kIGNsYXNzIGFuZCB0aGVuIGNhbGwgdGhlIHNldFdlYlNlcnZpY2VEYXRhTW9kZWwKLQkJLy8gbWV0aG9kIGluIHRoaXMgY2xhc3MuCi0JCWRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBBeGlzMkNsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAKLQkJCQkJCQkJICJXZWJTZXJ2aWNlRGF0YU1vZGVsIiwgIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJIEF4aXMyQ2xpZW50Q29uZmlnV2lkZ2V0RmFjdG9yeS5jbGFzcyApOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlRGF0YU1vZGVsKCBEYXRhTW9kZWwgbW9kZWwgKXsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdCgpewotCQkgIHdzQ2xpZW50QXhpczJUeXBlID0gbmV3IFdlYlNlcnZpY2VDbGllbnRBeGlzMlR5cGUobW9kZWwpOwotCQkgIGFkYXB0ZXIgPSBuZXcgV2lkZ2V0QmluZGluZ1RvV2lkZ2V0RmFjdG9yeUFkYXB0ZXIod3NDbGllbnRBeGlzMlR5cGUgKTsKLQkJICBwcm94eUNvbmZpZ1dpZGdldCA9IGFkYXB0ZXIuZ2V0V2lkZ2V0KCAiQXhpc0NsaWVudFN0YXJ0IiApOyAvLyROT04tTkxTLTEkCi0JCSAgcHJveHlXaWRnZXQgICAgICAgPSAoQXhpczJQcm94eVdpZGdldClwcm94eUNvbmZpZ1dpZGdldAotCQkgIAkJCQkuZ2V0V2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkuY3JlYXRlKCk7Ci0JCSAgbWFwcGluZ3NXaWRnZXQgICA9IGFkYXB0ZXIuZ2V0V2lkZ2V0KCAiQXhpc0NsaWVudEJlYW5NYXBwaW5nIiApOyAvLyROT04tTkxTLTEkCi0JCSAgYWRhcHRlci5yZWdpc3RlckRhdGFNYXBwaW5ncyggZGF0YVJlZ2lzdHJ5ICk7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMyL2NvbnN1bXB0aW9uL3VpL3dzcnQvQXhpczJXZWJTZXJ2aWNlQ2xpZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMyL2NvbnN1bXB0aW9uL3VpL3dzcnQvQXhpczJXZWJTZXJ2aWNlQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYWZlNWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzMi9jb25zdW1wdGlvbi91aS93c3J0L0F4aXMyV2ViU2VydmljZUNsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDIzMCAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiAKLSAqIAkJCQkJCQkJCQkgIHJ1bnRpbWUgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzYyCi0gKiAyMDA3MDUxOCAgIDE4NzMxMSBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBGaXhpbmcgdGVzdCByZXNvdXJjZSBhZGRpdGlvbgotICogMjAwODA2MjAgICAxOTI1Mjcgc2FtaW5kYXdAd3NvMi5jb20gLSBTYW1pbmRhIFdpamVyYXRuZSwgVXBkYXRlIHRoZSBtb2RlbCBpbmZvcm1hdGlvbiB3aXRoIHRoZSBheGlzMiBwcmVmZXJlbmNlIHNldHRpbmdzCi0gKiAyMDA4MDYyMSAgIDIxMDgxNyBzYW1pbmRhd0B3c28yLmNvbSAtIFNhbWluZGEgV2lqZXJhdG5lLCBTZXR0aW5nIHRoZSBwcm94eUJlYW4gYW5kIHByb3h5RW5kUG9pbnQgdmFsdWVzCi0gKiAyMDA4MDYyNSAgIDIxMDgxNyBzYW1pbmRhd0B3c28yLmNvbSAtIFNhbWluZGEgV2lqZXJhdG5lLCBTZXR0aW5nIHRoZSBwcm94eUJlYW4gYW5kIHByb3h5RW5kUG9pbnQgdmFsdWVzIC0gUmVmYWN0b3JpbmcKLSAqIDIwMDgwNjIyICAgMjQxMTcwIHNhbWluZGF3QHdzbzIuY29tIC0gU2FtaW5kYSBXaWplcmF0bmUsIEF4aXMyIHByZWZlcmVuY2VzIHJlc3BlY3RlZCB3aGVuIGNsaWNrIGZpbmlzaCBpbiAxc3QgcGFnZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzMi5jb25zdW1wdGlvbi51aS53c3J0OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS5jb21tYW5kLkF4aXMyQ2xpZW50Q29kZWdlbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZC5BeGlzMkNsaWVudERlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmQuQXhpczJDbGllbnRPdXRwdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmQuQXhpczJDbGllbnRUZXN0Q2FzZUludGVncmF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZC5BeGlzMldlYnNlcnZpY2VzU2VydmVyQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS5kYXRhLkRhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb25zdGFudC5BeGlzMkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBeGlzMkVtaXR0ZXJDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLnV0aWxzLkF4aXMyQ29yZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzMi5jb25zdW1wdGlvbi51aS50YXNrLkRlZmF1bHRzRm9ySFRUUEJhc2ljQXV0aENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuSUNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuZWNsaXBzZS5FY2xpcHNlRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuQWJzdHJhY3RXZWJTZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuV2ViU2VydmljZUNsaWVudEluZm87Ci0KLXB1YmxpYyBjbGFzcyBBeGlzMldlYlNlcnZpY2VDbGllbnQgZXh0ZW5kcyBBYnN0cmFjdFdlYlNlcnZpY2VDbGllbnQgewotCi0JcHVibGljIEF4aXMyV2ViU2VydmljZUNsaWVudChXZWJTZXJ2aWNlQ2xpZW50SW5mbyBpbmZvKSB7Ci0JCXN1cGVyKGluZm8pOwotCX0KLQotCXB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgYXNzZW1ibGUoSUVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LAotCQkJSVNlbGVjdGlvbiBhcmcyLCBTdHJpbmcgYXJnMywgU3RyaW5nIGFyZzQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElDb21tYW5kRmFjdG9yeSBkZXBsb3koSUVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LAotCQkJSVNlbGVjdGlvbiBhcmcyLCBTdHJpbmcgYXJnMywgU3RyaW5nIGFyZzQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElDb21tYW5kRmFjdG9yeSBkZXZlbG9wKElFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwKLQkJCUlTZWxlY3Rpb24gc2VsLCBTdHJpbmcgcHJvamVjdCwgU3RyaW5nIGVhclByb2plY3QpIHsKLQkJRGF0YU1vZGVsIG1vZGVsID0gbmV3IERhdGFNb2RlbCgpOwotCQkKLQkJRWNsaXBzZUVudmlyb25tZW50IGVudmlyb25tZW50ID0gKEVjbGlwc2VFbnZpcm9ubWVudCllbnY7Ci0JCXJlZ2lzdGVyRGF0YU1hcHBpbmdzKCBlbnZpcm9ubWVudC5nZXRDb21tYW5kTWFuYWdlcigpLmdldE1hcHBpbmdSZWdpc3RyeSgpKTsKLQkJbW9kZWwuc2V0V2ViUHJvamVjdE5hbWUocHJvamVjdCk7Ci0JCXNldHVwRGF0YU1vZGVsRGVmYXVsdFByZWZlcmVuY2VWYWx1ZXMobW9kZWwpOwotCQlWZWN0b3IgY29tbWFuZHMgPSBuZXcgVmVjdG9yKCk7Ci0JCWNvbW1hbmRzLmFkZChuZXcgQXhpczJDbGllbnREZWZhdWx0aW5nQ29tbWFuZChtb2RlbCx0aGlzKSk7Ci0JCUF4aXMyQ2xpZW50T3V0cHV0Q29tbWFuZCBheGlzMkNsaWVudE91dHB1dENvbW1hbmQgPSBuZXcgQXhpczJDbGllbnRPdXRwdXRDb21tYW5kKHRoaXMsY3R4KTsKLQkJY29tbWFuZHMuYWRkKGF4aXMyQ2xpZW50T3V0cHV0Q29tbWFuZCk7Ci0JCWNvbW1hbmRzLmFkZChuZXcgQXhpczJXZWJzZXJ2aWNlc1NlcnZlckNvbW1hbmQobW9kZWwsIHByb2plY3QpKTsKLQkJY29tbWFuZHMuYWRkKG5ldyBBeGlzMkNsaWVudENvZGVnZW5Db21tYW5kKG1vZGVsKSk7Ci0JCWNvbW1hbmRzLmFkZChuZXcgQXhpczJDbGllbnRUZXN0Q2FzZUludGVncmF0ZUNvbW1hbmQoCi0JCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3QpLG1vZGVsKSk7Ci0JCXNldFByb3h5QmVhbkFuZEVuZFBvaW50VmFsdWVzKGF4aXMyQ2xpZW50T3V0cHV0Q29tbWFuZCk7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ29tbWFuZEZhY3RvcnkoY29tbWFuZHMpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXR1cERhdGFNb2RlbERlZmF1bHRQcmVmZXJlbmNlVmFsdWVzKERhdGFNb2RlbCBtb2RlbCl7Ci0JCVBlcnNpc3RlbnRBeGlzMkVtaXR0ZXJDb250ZXh0IGF4aXMyUHJlZiA9IFBlcnNpc3RlbnRBeGlzMkVtaXR0ZXJDb250ZXh0LmdldEluc3RhbmNlKCk7Ci0JCW1vZGVsLnNldEFTeW5jKGF4aXMyUHJlZi5pc0FzeW5jKCkpOwotCQltb2RlbC5zZXRTeW5jKGF4aXMyUHJlZi5pc1N5bmMoKSk7Ci0JCW1vZGVsLnNldFRlc3RDYXNlQ2hlY2soYXhpczJQcmVmLmlzQ2xpZW50VGVzdENhc2UoKSk7Ci0JCW1vZGVsLnNldEdlbmVyYXRlQWxsQ2hlY2soYXhpczJQcmVmLmlzQ2xpZW50R2VuZXJhdGVBbGwoKSk7Ci0JCWlmICgoYXhpczJQcmVmLmdldFNlcnZpY2VEYXRhYmluZGluZygpPT1udWxsKSB8fCAoYXhpczJQcmVmLmdldFNlcnZpY2VEYXRhYmluZGluZygpLmVxdWFsc0lnbm9yZUNhc2UoIiIpKSkKLQkJCW1vZGVsLnNldERhdGFiaW5kaW5nVHlwZShBeGlzMkNvbnN0YW50cy5EQVRBX0JJTkRJTkdfQURCKTsKLQkJZWxzZQotCQkJbW9kZWwuc2V0RGF0YWJpbmRpbmdUeXBlKGF4aXMyUHJlZi5nZXRTZXJ2aWNlRGF0YWJpbmRpbmcoKSk7Ci0JfQotCQotCi0JLyoqCi0JICogZXh0cmFjdCB0aGUgcHJveHlCZWFuIHZhbHVlIGFuZCB0aGUgcHJveHlFbmRQb2ludCB2YWx1ZSBmcm9tIHRoZSBzZWxlY3RlZCBXU0RMIGZpbGUgYW5kCi0JICogc2V0IHRob3NlIHZhbHVlcyBpbiB0aGUgQXhpczJDbGllbnRPdXRwdXRDb21tYW5kIG9iamVjdAotCSAqIEBwYXJhbSBheGlzMkNsaWVudE91dHB1dENvbW1hbmQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm94eUJlYW5BbmRFbmRQb2ludFZhbHVlcyhBeGlzMkNsaWVudE91dHB1dENvbW1hbmQgYXhpczJDbGllbnRPdXRwdXRDb21tYW5kKXsKLQotCQlTdHJpbmcgZmlsZU5hbWU7Ci0JCS8vR2V0IHRoZSB2YWxpZCBmaWxlbmFtZQotCQlmaWxlTmFtZT10aGlzLmdldFdlYlNlcnZpY2VDbGllbnRJbmZvKCkuZ2V0V3NkbFVSTCgpOwotCi0JCVN0cmluZyBTdHViPSJTdHViIjsKLQkJU3RyaW5nIHNlcnZpY2VOYW1lPUF4aXMyQ29yZVV0aWxzLmdldFNlcnZpY2VOYW1lRnJvbVdTREwoZmlsZU5hbWUpOwotCQlTdHJpbmcgcHJveHlFbmRQb2ludD1BeGlzMkNvcmVVdGlscy5nZXRTZXJ2aWNlRW5kUG9pbnRGcm9tV1NETChmaWxlTmFtZSwgc2VydmljZU5hbWUpOwotCQkKLQkJaWYgKHByb3h5RW5kUG9pbnQhPW51bGwpewotCQkJU3RyaW5nIHByb3h5QmVhbj1zZXJ2aWNlTmFtZStTdHViOwotCQkJYXhpczJDbGllbnRPdXRwdXRDb21tYW5kLnNldFByb3h5QmVhbihwcm94eUJlYW4pOwotCQkJYXhpczJDbGllbnRPdXRwdXRDb21tYW5kLnNldFByb3h5RW5kcG9pbnQocHJveHlFbmRQb2ludCk7Ci0JCX0KLQl9Ci0JCQotCi0JcHVibGljIElDb21tYW5kRmFjdG9yeSBpbnN0YWxsKElFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwKLQkJCUlTZWxlY3Rpb24gc2VsLCBTdHJpbmcgcHJvamVjdCwgU3RyaW5nIGVhclByb2plY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElDb21tYW5kRmFjdG9yeSBydW4oSUVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LAotCQkJSVNlbGVjdGlvbiBzZWwsIFN0cmluZyBwcm9qZWN0LCBTdHJpbmcgZWFyUHJvamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IHJlZ2lzdHJ5KXsKLQkJLy8gQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kCi0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpczJDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgCi0JCQkJCQkJIldzZGxVUkwiLCAKLQkJCQkJCQlEZWZhdWx0c0ZvckhUVFBCYXNpY0F1dGhDb21tYW5kLmNsYXNzLAotCQkJCQkJCSJXc2RsU2VydmljZVVSTCIsIG51bGwpOyAvL09LCi0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRjNWUzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjhiNmM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYnVpbGQueG1sCi1qYXZhQ29tcGlsZXIuLi5hcmdzCi1AZG90Ci1vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZV8xLjAuMTAyLjIwMDgwNDAyMDIwNC5qYXIKLXRlbXAuZm9sZGVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIzMGQyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU3NzkzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSNUdWUgTWFyIDIwIDEwOjQ1OjA0IExLVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA1NTY3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJVBMVUdJTl9OQU1FCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMjA0LnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUucGx1Z2luLldlYlNlcnZpY2VBeGlzMkNvcmVQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVQTFVHSU5fUFJPVklERVIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuYXBhY2hlLmFudCwKLSBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWksCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLAotIG9yZy5lY2xpcHNlLmVtZi5jb21tb24sCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLAotIG9yZy5lY2xpcHNlLmplbSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUsCi0gb3JnLmVjbGlwc2UuanN0LndzLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWksCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb25zdGFudCwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb250ZXh0LAotIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLnBsdWdpbiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5wbHVnaW4ubWVzc2FnZXMsCi0gb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUudXRpbHMKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc5OWJkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZjM2E5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSMgLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgMjAwNzA0MjYgICAxODMwNDYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aAotIyAyMDA4MDUyMSAgIDIyMzQ1MyBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotIyAyMDA4MDkyNCAgIDI0ODAyMyBzYW1pbmRhd0B3c28yLmNvbSAtIFNhbWluZGEgV2lqZXJhdG5lIC0gYWRkaW5nIHJlc291cmNlcyBmb2xkZXIgZm9yIGV4cG9ydAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICByZXNvdXJjZXMvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgxMDhhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0jIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIDIwMDcwNDA1ICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byAKLSMJCQkJCWludHJvZHVzZSB0aGUgQXhpczIgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSMgMjAwNzA1MDEgICAxODQ2MTcgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgUHJvdmlkZSBwbHVnaW4gZGV0YWlscwotIyAyMDA4MDEzMCAgIDIxNjk5NyBrYXRlcEB3c28yLmNvbSAtIEthdGUgUHJpY2UKLSMgMjAwODA1MzAgICAyMzQ4NDEga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4sIENoYW5nZSBwbHVnaW4gcHJvdmlkZXIgdG8gRWNsaXBzZS5vcmcKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLQotIwotIyBNZXNzYWdlcyBpbiBwbHVnaW4ueG1sLgotIwotUExVR0lOX05BTUU9V2Vic2VydmljZSBBeGlzMiBDb3JlIFBsdWctaW4KLVBMVUdJTl9QUk9WSURFUj1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi1BWElTMl9DQVRPR0VSWV9MQUJFTD1BeGlzMiBXZWIgU2VydmljZXMKLUFYSVMyX0NBVE9HRVJZX0RJU0NSSVBUSU9OPUVuYWJsZXMgV2ViIHNlcnZpY2VzIGdlbmVyYXRpb24gdGhyb3VnaCB0aGUgQXhpczIgV2ViIHNlcnZpY2VzIGVuZ2luZS4KLQotQVhJUzJfRkFDRVRfQ09SRV9MQUJFTD1BeGlzMiBXZWIgU2VydmljZXMgQ29yZQotQVhJUzJfRkFDRVRfQ09SRV9ESVNDUklQVElPTj1QcmVwYXJlcyB0aGUgcHJvamVjdCBmb3IgV2ViIHNlcnZpY2VzIGdlbmVyYXRpb24gdGhyb3VnaCB0aGUgQXhpczIgV2ViIHNlcnZpY2VzIGVuZ2luZS4KLQotCi1BWElTMl9GQUNFVF9FWFRfTEFCRUw9QXhpczIgV2ViIFNlcnZpY2VzIEV4dGVuc2lvbnMKLUFYSVMyX0ZBQ0VUX0VYVF9ESVNDUklQVElPTj1QcmVwYXJlcyB0aGUgcHJvamVjdCBmb3IgYWRkaXRpb25hbCBXZWIgc2VydmljZXMgc3VwcG9ydCB3aXRoIHRoZSBBeGlzMiBXZWIgc2VydmljZXMgcnVudGltZS4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY2NmZkMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi08cGx1Z2luPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIj4KLQkKLQkgIDxjYXRlZ29yeSBpZD0iYXhpczIuY2F0ZWdvcnkiPgotICAgIAk8bGFiZWw+JUFYSVMyX0NBVE9HRVJZX0xBQkVMPC9sYWJlbD4KLSAgICAJPGRlc2NyaXB0aW9uPiVBWElTMl9DQVRPR0VSWV9ESVNDUklQVElPTjwvZGVzY3JpcHRpb24+Ci0gIAkgIDwvY2F0ZWdvcnk+Ci0KLQkJICA8cHJvamVjdC1mYWNldCBpZD0iYXhpczIuY29yZSI+Ci0JCQk8bGFiZWw+JUFYSVMyX0ZBQ0VUX0NPUkVfTEFCRUw8L2xhYmVsPgotCQkJPGRlc2NyaXB0aW9uPiVBWElTMl9GQUNFVF9DT1JFX0RJU0NSSVBUSU9OPC9kZXNjcmlwdGlvbj4KLQkJCTxtZW1iZXIgY2F0ZWdvcnk9ImF4aXMyLmNhdGVnb3J5ICIvPgotCQkgIDwvcHJvamVjdC1mYWNldD4KLQotCQk8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJheGlzMi5jb3JlIiB2ZXJzaW9uPSIxLjEiPgotCQkgICAgPGNvbnN0cmFpbnQ+Ci0gICAgICAJCQk8cmVxdWlyZXMgZmFjZXQ9ImpzdC53ZWIiIHZlcnNpb249IjIuMiwyLjMsMi40LDIuNSIvPgotICAgIAkJPC9jb25zdHJhaW50PgotICAgIAkJPGFjdGlvbiB0eXBlPSJJTlNUQUxMIj4KLSAgICAgIAkJCTxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmZhY2V0LmRlbGlnYXRlLkF4aXMyQ29yZUZhY2V0SW5zdGFsbERlbGVnYXRlIi8+Ci0gICAgCQk8L2FjdGlvbj4KLTwhLS0KLSAgICAJCTxhY3Rpb24gdHlwZT0iVU5JTlNUQUxMIj4KLSAgICAgIAkJCTxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmZhY2V0LmRlbGlnYXRlLkF4aXMyQ29yZUZhY2V0VW5JbnN0YWxsRGVsZWdhdGUiLz4KLSAgICAJCTwvYWN0aW9uPgotLS0+Ci0gIAkJPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0KLQkJICA8cHJvamVjdC1mYWNldCBpZD0iYXhpczIuZXh0Ij4KLQkJCTxsYWJlbD4lQVhJUzJfRkFDRVRfRVhUX0xBQkVMPC9sYWJlbD4KLQkJCTxkZXNjcmlwdGlvbj4lQVhJUzJfRkFDRVRfRVhUX0RJU0NSSVBUSU9OPC9kZXNjcmlwdGlvbj4KLQkJCTxtZW1iZXIgY2F0ZWdvcnk9ImF4aXMyLmNhdGVnb3J5IiAvPgotCQkgIDwvcHJvamVjdC1mYWNldD4KLQotCQk8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJheGlzMi5leHQiIHZlcnNpb249IjEuMSI+Ci0JCSAgICA8Y29uc3RyYWludD4KLSAgICAgIAkJCTxyZXF1aXJlcyBmYWNldD0iYXhpczIuY29yZSIgdmVyc2lvbj0iMS4xIi8+Ci0gICAgCQk8L2NvbnN0cmFpbnQ+Ci0gICAgCQk8YWN0aW9uIHR5cGU9IklOU1RBTEwiPgotICAgICAgCQkJPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuZmFjZXQuZGVsaWdhdGUuQXhpczJFeHRGYWNldEluc3RhbGxEZWxlZ2F0ZSIvPgotICAgIAkJPC9hY3Rpb24+Ci08IS0tCi0gICAgCQk8YWN0aW9uIHR5cGU9IlVOSU5TVEFMTCI+Ci0gICAgICAJCQk8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5mYWNldC5kZWxpZ2F0ZS5BeGlzMkV4dEZhY2V0VW5JbnN0YWxsRGVsZWdhdGUiLz4KLSAgICAJCTwvYWN0aW9uPgotLS0+Ci0gIAkJPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0gIAotCTwvZXh0ZW5zaW9uPgotCi0KLQk8ZXh0ZW5zaW9uCi0gICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWVzIj4KLSAgICA8c3VwcG9ydGVkPgotICAgICAgPHJ1bnRpbWUtY29tcG9uZW50Ci0gICAgICAgICBhbnk9InRydWUiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImF4aXMyLmNvcmUiCi0gICAgICAgICB2ZXJzaW9uPSIxLjEiLz4KLSAgICAgIDxmYWNldAotICAgICAgICAgaWQ9ImF4aXMyLmV4dCIKLSAgICAgICAgIHZlcnNpb249IjEuMSIvPgotICAgIDwvc3VwcG9ydGVkPgotICAgPC9leHRlbnNpb24+Ci0KLQotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9yZXNvdXJjZXMvc2VydmljZXMueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9yZXNvdXJjZXMvc2VydmljZXMueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjFjYjVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvcmVzb3VyY2VzL3NlcnZpY2VzLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotICAgIDx4czplbGVtZW50IG5hbWU9InNlcnZpY2VHcm91cCI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJzZXJ2aWNlIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9InBhcmFtZXRlciIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJtb2R1bGUiLz4KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InNlcnZpY2UiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ibW9kdWxlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ib3BlcmF0aW9uIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0icGFyYW1ldGVyIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0iZGVzY3JpcHRpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJEZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImV4Y2x1ZGVPcGVyYXRpb25zIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ibWVzc2FnZVJlY2VpdmVycyIvPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InNjaGVtYSIvPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InRyYW5zcG9ydHMiLz4KLSAgICAgICAgICAgICAgICA8L3hzOmNob2ljZT4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iZGF0YUxvY2F0b3IiLz4KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNsYXNzIi8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2NvcGUiIHR5cGU9InhzOk5DTmFtZSIvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXROYW1lc3BhY2UiIHR5cGU9InhzOmFueVVSSSIvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhY3RpdmF0ZSIgdHlwZT0ieHM6Ym9vbGVhbiIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0iRGVzY3JpcHRpb24iIHR5cGU9InhzOnN0cmluZyIvPgotICAgIDx4czplbGVtZW50IG5hbWU9ImV4Y2x1ZGVPcGVyYXRpb25zIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ib3BlcmF0aW9uIiB0eXBlPSJ4czpzdHJpbmciIC8+ICAKLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9Im1lc3NhZ2VSZWNlaXZlcnMiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0ibWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJzY2hlbWEiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNjaGVtYU5hbWVzcGFjZSIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6YW55VVJJIi8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InRyYW5zcG9ydHMiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ0cmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InRyYW5zcG9ydCIgdHlwZT0ieHM6TkNOYW1lIi8+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0iZGF0YUxvY2F0b3IiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9ImRpYWxlY3RMb2NhdG9yIi8+Ci0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJkaWFsZWN0TG9jYXRvciI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZGlhbGVjdCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6YW55VVJJIi8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InBhcmFtZXRlciI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZSBtaXhlZD0idHJ1ZSI+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImxvY2tlZCIgdHlwZT0ieHM6Tk1UT0tFTiIvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpOQ05hbWUiLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ibW9kdWxlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWYiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOk5DTmFtZSIvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJvcGVyYXRpb24iPgotICAgICAgICA8eHM6Y29tcGxleFR5cGUgbWl4ZWQ9InRydWUiPgotICAgICAgICAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9Im1lc3NhZ2VSZWNlaXZlciIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ibW9kdWxlIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJwYXJhbWV0ZXIiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImFjdGlvbk1hcHBpbmciLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImZhdWx0QWN0aW9uTWFwcGluZyIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ibWVzc2FnZSIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ib3V0cHV0QWN0aW9uTWFwcGluZyIvPgotICAgICAgICAgICAgPC94czpjaG9pY2U+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1lcCIgdHlwZT0ieHM6YW55VVJJIi8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOk5DTmFtZSIvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJxbmFtZSIgdHlwZT0ieHM6TkNOYW1lIi8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9ImFjdGlvbk1hcHBpbmciIHR5cGU9InhzOmFueVVSSSIvPgotICAgIDx4czplbGVtZW50IG5hbWU9ImZhdWx0QWN0aW9uTWFwcGluZyI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW55VVJJIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmYXVsdE5hbWUiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOk5DTmFtZSIvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpzaW1wbGVDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJtZXNzYWdlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0icGFyYW1ldGVyIi8+Ci0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJsYWJlbCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6TkNOYW1lIi8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9Im91dHB1dEFjdGlvbk1hcHBpbmciIHR5cGU9InhzOmFueVVSSSIvPgotICAgIDx4czplbGVtZW50IG5hbWU9Im1lc3NhZ2VSZWNlaXZlciI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOk5DTmFtZSIvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtZXAiIHR5cGU9InhzOmFueVVSSSIvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvcmUvY29uc3RhbnQvQXhpczJDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb3JlL2NvbnN0YW50L0F4aXMyQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNWQzOGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvcmUvY29uc3RhbnQvQXhpczJDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzA4MjQgICAyMDA1MTUgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgTk9OLU5MUyBtb3ZlIHRvIHNlcGVyYXRlIGZpbGUKLSAqIDIwMDcxMDExICAgMjA1OTcyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEF4aXMyIExpYnJhcmllcyBMaWNlbnNlIGZpbGVzIGZpeAotICogMjAwNzEwMjkgICAyMDY5Njcgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aAotICogMjAwODA1MjEgICAyMzEwOTggc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgRml4IGZvciBBeGlzMiAxLjQgZGVwZW5kZW5jeSBjaGVuZ2UKLSAqIDIwMDgwNjA0ICAgMTkzMzcxIHNhbWluZGF3QHdzbzIuY29tIC0gU2FtaW5kYSBXaWplcmF0bmUsIGNyZWF0aW5nIGEgZnVuY3Rpb24gdG8gdmFsaWRhdGUgc2VydmljZXMueG1sCi0gKiAyMDA5MTIwNyAgIDE5MjAwNSBzYW1pbmRhd0B3c28yLmNvbSAtIG1lcmdlIHRoZSB3ZWIueG1sIHRvIGhhdmUgYXhpczIgd2VsY29tZSBmaWxlIGRlZmluZWQKLSAqIDIwMDkwMzA3ICAgMTk2OTU0IHNhbWluZGF3QHdzbzIuY29tIC0gU2FtaW5kYSBXaWplcmF0bmUsIFN1cHBvcnQgWE1MQmVhbnMgZGF0YSBiaW5kaW5nCi0gKiAyMDEwMDMwOAkgIDI4MjQ2NiBzYW1pbmRhd0B3c28yLmNvbSAtIFNhbWluZGEgV2lqZXJhdG5lLCBzdXBwb3J0IGZvciBheGlzMiAxLjUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb25zdGFudDsKLQotcHVibGljIGNsYXNzIEF4aXMyQ29uc3RhbnRzIHsKLQkKLQkvL0F4aXMyIENvcmUgUGx1Z2luIENvbnN0YW50cyAgCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUl9URU1QV0FSPSJ0ZW1wd2FyIjsJCQkJCQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUl9FWFBMT0FERURfVEVNUFdBUj0iZXhwbG9hZGVkd2FyIjsJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSX0xJQj0ibGliIjsJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSX1RFU1Q9InRlc3QiOwkJCQkJCQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX0FYSVMyX1dBUj0iYXhpczIud2FyIjsJCQkJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgIE5VTEw9IiI7CQkJCQkJCQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBREI9ImFkYiI7CQkJCQkJCQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQVI9ImFhciI7CQkJCQkJCQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVI9ImphciI7CQkJCQkJCQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWFQ9InR4dCI7CQkJCQkJCQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QX0FYSVMyX0ZBQ0VUX0RJUj0ib3JnLmFwYWNoZS5heGlzMi5mYWNldCI7CS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJfRE9UX01FVEFEQVRBPSIubWV0YWRhdGEiOwkJCQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUl9ET1RfUExVR0lOUz0iLnBsdWdpbnMiOwkJCQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJfVU5aSVA9Im56aXAiOwkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMX1NFUlZFUl9QT1JUPSJodHRwOi8vbG9jYWxob3N0OjgwODAiOwkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VTPSJzZXJ2aWNlcyI7CQkJCQkJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCQVBQX0VYUExPREVEX1NFUlZFUl9MT0NBVElPTl9GSUxFPQotCQkJInNlcnZlci5wcm9wZXJ0aWVzIjsJCQkJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX1NUQVRVU19MT0NBVElPTl9GSUxFPSJzdGF0dXMucHJvcGVydGllcyI7CS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJfU1RBVFVTX0xPQ0FUSU9OX0ZJTEU9Indhci5wcm9wZXJ0aWVzIjsJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9LRVlfUEFUSD0icGF0aCI7CQkJCQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0tFWV9TVEFUVVM9InN0YXR1cyI7CQkJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX1NUQVRVU19QQVNTPSJwYXNzIjsJCQkJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX1NUQVRVU19GQUlMPSJmYWlsIjsJCQkJCQkvLyROT04tTkxTLTEkCi0JCi0JLy9BeGlzMiBDcmVhdGlvbiBQbHVnaW4gQ29uc3RhbnRzIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfU0VSVklDRVNfWE1MPSJzZXJ2aWNlcy54bWwiOwkJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9YTUw9IioueG1sIjsJCQkJCQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJfTUVUQV9JTkY9Ik1FVEEtSU5GIjsJCQkJCQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUl9CVUlMRD0iYnVpbGQiOwkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUl9TUkM9InNyYyI7CQkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUl9DTEFTU0VTPSJjbGFzc2VzIjsJCQkJCQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUl9SRVNPVVJDRVM9InJlc291cmNlcyI7CQkJCQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUl9XRUJfSU5GPSJXRUItSU5GIjsJCQkJCQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUl9TRVJWSUNFUz0ic2VydmljZXMiOwkJCQkJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSX1dFQlNFUlZJQ0VTPSJ3ZWJzZXJ2aWNlcyI7CQkJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSX1dFQkNPTlRFTlQ9IldlYkNvbnRlbnQiOwkJCQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVJfVEFTSz0iamFyIjsJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVhJUzJfUFJPSkVDVD0ib3JnLmVjbGlwc2UuanN0LndzLmF4aXMyIjsJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0RFR0VOX1JFU1VMVFM9ImNvZGVnZW4iOwkJCQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX0JJTkRJTkdfQURCPSJBREIiOwkJCQkJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9CSU5ESU5HX1hNTEJFQU5TPSJYTUxCRUFOUyI7CQkJCQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfQklORElOR19OT05FPSJOT05FIjsJCQkJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0tFTEVUT05fU1VGRklYPSJTa2VsZXRvbi5qYXZhIjsJCQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9GT0xERVI9InJlc291cmNlcyI7CQkJCQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VTX1hTRF9TQ0hFTUFfTkFNRT0ic2VydmljZXMueHNkIjsJCQkvLyROT04tTkxTLTEkCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9TQ0hFTUE9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIjsJLy8kTk9OLU5MUy0xJAotCQotCS8vQXhpczIgQ29uc3VtcHRpb24gUGx1Z2luIENvbnN0YW50cyAgCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlVOSVRfSkFSPSJqdW5pdC5qYXIiOwkJCQkJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlVOSVRfQlVORExFPSJvcmcuanVuaXQiOwkJCQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJfQVhJUzJfV0VCPSJheGlzMi13ZWIiOwkJCQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1dFQl9YTUw9IndlYi54bWwiOwkJCQkJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVhJUzJfV0VMQ09NRV9GSUxFPSIvIitESVJfQVhJUzJfV0VCKyIvaW5kZXguanNwIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9TRVJWTEVUX0FQST0ic2VydmxldGFwaSI7CQkJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBBWElTMl9MSUJfUFJFRklYRVMgPSB7CQkJCQkJCS8vJE5PTi1OTFMtMSQKLSAgICAgICAgImFudCIsCi0gICAgICAgICJheGlvbSIsCi0gICAgICAgICJheGlzMiIsCi0gICAgICAgICJjb21tb25zIiwKLSAgICAgICAgImxvZzRqIiwKLSAgICAgICAgIm5lZXRoaSIsCi0gICAgICAgICJzdGF4IiwKLSAgICAgICAgImdlcm9uaW1vLXN0YXgtYXBpXzEuMF9zcGVjIiwKLSAgICAgICAgIndzZGw0aiIsCi0gICAgICAgICJ3c3R4IiwKLSAgICAgICAgInhiZWFuIiwKLSAgICAgICAgIlhtbFNjaGVtYSIsCi0gICAgICAgICJ3b2RlbiIsCi0gICAgICAgICJhY3RpdmF0aW9uIiwKLSAgICAgICAgImFubm9nZW4iLAotICAgICAgICAiYmFja3BvcnQtdXRpbCIsCi0gICAgICAgICJtZXgtaW1wbCIsCi0gICAgICAgICJtYWlsIiwKLSAgICAgICAgInhtbGJlYW5zIiwKLSAgICAgICAgImh0dHBjb3JlIgotCX07Ci19CQotCQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvcmUvY29udGV4dC9BeGlzMkVtaXR0ZXJDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29yZS9jb250ZXh0L0F4aXMyRW1pdHRlckNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q3MjE3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29yZS9jb250ZXh0L0F4aXMyRW1pdHRlckNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzA1MTYgICAxODMxNDcgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCBGaXggZm9yIHRoZSBwZXJzaXN0aW5nIERCQ1MgcGF0aHMKLSAqIDIwMDcwNTIzICAgMTc0ODc2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIFBlcnNpc3QgUHJlZmVyZW5jZXMgaW5zaWRlIEZyYW1ld29yawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb250ZXh0OwotCi1wdWJsaWMgaW50ZXJmYWNlIEF4aXMyRW1pdHRlckNvbnRleHQgewotCi0JLyoqCi0JICogVGhpcyBjb25zdGFudCBzdHJpbmcgaXMgdXNlZCB0byBsb29rdXAgdGhlIHJ1bnRpbWUgbG9jYXRpb24gZ2VuZXJhbAotCSAqIHByZWZlcmVuY2UgZnJvbSB0aGUgcGx1Z2lucyBsb2NhbCBwcmVmZXJlbmNlcyBzdG9yZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0FYSVMyX1JVTlRJTUVfTE9DQVRJT04gPSAiYXhpczJSdW50aW1lTG9jYXRpb24iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfQVhJUzJfU0VSVkVSX0lTX1dBUiA9ICJheGlzMlNlcnZlclBhdGhSZXByZXNlbnRzV2FyIjsKLQkvL0F4aXMyIFByZWZlcmVuY2VzCi0JLy9TZXJ2aWNlIENvZGUgZ2VuZXJhdGlvbiBPcHRpb25zCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9TRVJWSUNFX0RBVEFCSU5ESU5HID0gInNlcnZpY2VEYXRhYmluZGluZyI7IAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfU0VSVklDRV9JTlRFUkZBQ0VfU0tFTEVUT04gPSAic2VydmljZUludGVyZmFjZVNrZWxldG9uIjsgCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9TRVJWSUNFX0dFTkVSQVRFX0FMTCA9ICJzZXJ2aWNlR2VuZXJhdGVBbGwiOyAKLQkKLQkvL0NsaWVudCBDb2RlIGdlbmVyYXRpb24gT3B0aW9ucwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfQ0xJRU5UX1NZTkMgPSAic3luYyI7IAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfQ0xJRU5UX0FTWU5DID0gImFzeW5jIjsgCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9DTElFTlRfREFUQUJJTkRJTkcgPSAiY2xlaW50RGF0YWJpbmRpbmciOyAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0NMSUVOVF9URVNUQ0FTRSA9ICJjbGllbnRUZXN0Y2FzZSI7IAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfQ0xJRU5UX0dFTkVSQVRFX0FMTCA9ICJjbGllbnRHZW5lcmF0ZUFsbCI7IAotCQotCS8vU2VydmljZSBBcmNoaXZlIE9wdGlvbnMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0FBUl9FWFRFTlRJT04gID0gImFhckV4dGVudGlvbiI7Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2VsZWN0aW9uIHNldCB0aGUgYXhpczIgcnVudGltZSBsb2NhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBeGlzMlJ1bnRpbWVMb2NhdGlvbihTdHJpbmcgcnVudGltZUxvY2F0aW9uKTsKLQotCS8qKgotCSAqIEBwYXJhbSByZXR1cm5zIHRoZSBheGlzMiBydW50aW1lIGxvY2F0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXhpczJSdW50aW1lTG9jYXRpb24oKTsKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0F4aXMyU2VydmVyUGF0aFJlcHJlc2VudHNXYXIoKTsKLQotCXB1YmxpYyB2b2lkIHNldEF4aXMyU2VydmVyUGF0aFJlcHJlc2VudHNXYXIoU3RyaW5nIGlzV2FyKTsKLQotCS8vU2VydmljZSBDb2RlIGdlbmVyYXRpb24gT3B0aW9ucwotCi0JcHVibGljIHZvaWQgc2V0U2VydmljZURhdGFiaW5kaW5nKFN0cmluZyBzZXJ2aWNlRGF0YWJpbmRpbmcpOwotCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlRGF0YWJpbmRpbmcoKTsKLQotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VJbnRlcmZhY2VTa2VsZXRvbihib29sZWFuIHNlcnZpY2VJbnRlcmZhY2VTa2VsZXRvbik7Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NlcnZpY2VJbnRlcmZhY2VTa2VsZXRvbigpOwotCi0JcHVibGljIHZvaWQgc2V0U2VydmljZUdlbmVyYXRlQWxsKGJvb2xlYW4gc2VydmljZUdlbmVyYXRlQWxsKTsKLQotCXB1YmxpYyBib29sZWFuIGlzU2VydmljZUdlbmVyYXRlQWxsKCk7Ci0KLQotCS8vQ2xpZW50IENvZGUgZ2VuZXJhdGlvbiBPcHRpb25zCi0JcHVibGljIHZvaWQgc2V0U3luYyhib29sZWFuIGNsaWVudFN5bmMpOwotCi0JcHVibGljIGJvb2xlYW4gaXNTeW5jKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRBc3luYyhib29sZWFuIGNsaWVudEFzeW5jKTsKLQotCXB1YmxpYyBib29sZWFuIGlzQXN5bmMoKTsKLQotCXB1YmxpYyB2b2lkIHNldENsaWVudERhdGFiaW5kaW5nKFN0cmluZyBjbGllbnREYXRhYmluZGluZyk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENsaWVudERhdGFiaW5kaW5nKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRDbGllbnRUZXN0Q2FzZShib29sZWFuIGNsaWVudFRlc3RDYXNlKTsKLQotCXB1YmxpYyBib29sZWFuIGlzQ2xpZW50VGVzdENhc2UoKTsKLQotCXB1YmxpYyB2b2lkIHNldENsaWVudEdlbmVyYXRlQWxsKGJvb2xlYW4gY2xpZW50R2VuZXJhdGVBbGwpOwotCi0JcHVibGljIGJvb2xlYW4gaXNDbGllbnRHZW5lcmF0ZUFsbCgpOwotCi0JLy9BQVIgT3B0aW9ucwotCXB1YmxpYyB2b2lkIHNldEFhckV4dGVudGlvbihTdHJpbmcgYWFyRXh0ZW50aW9uKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWFyRXh0ZW50aW9uKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb3JlL2NvbnRleHQvQXhpczJFbWl0dGVyRGVmYXVsdHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb3JlL2NvbnRleHQvQXhpczJFbWl0dGVyRGVmYXVsdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZhYzljOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29yZS9jb250ZXh0L0F4aXMyRW1pdHRlckRlZmF1bHRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwNTE2ICAgMTgzMTQ3IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGggRml4IGZvciB0aGUgcGVyc2lzdGluZyBEQkNTIHBhdGhzCi0gKiAyMDA3MDUyMyAgIDE3NDg3NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBQZXJzaXN0IFByZWZlcmVuY2VzIGluc2lkZSBGcmFtZXdvcmsKLSAqIDIwMDcwODI0ICAgMjAwNTE1IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIE5PTi1OTFMgbW92ZSB0byBzZXBlcmF0ZSBmaWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb25zdGFudC5BeGlzMkNvbnN0YW50czsKLQotcHVibGljIGNsYXNzIEF4aXMyRW1pdHRlckRlZmF1bHRzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfQVhJUzJfUlVOVElNRV9MT0NBVElPTl9ERUZBVUxUID0gIiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIFBSRUZFUkVOQ0VfQVhJUzJfU0VSVkVSX0lTX1dBUiA9IGZhbHNlOwotCi0JLy9BeGlzMiBQcmVmZXJlbmNlcwotCS8vU2VydmljZSBDb2RlIGdlbmVyYXRpb24gT3B0aW9ucwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfU0VSVklDRV9EQVRBQklORElOR19ERUZBVUxUID0gQXhpczJDb25zdGFudHMuQURCOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBQUkVGRVJFTkNFX1NFUlZJQ0VfSU5URVJGQUNFX1NLRUxFVE9OX0RFRkFVTFQgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gUFJFRkVSRU5DRV9TRVJWSUNFX0dFTkVSQVRFX0FMTF9ERUZBVUxUID0gZmFsc2U7Ci0KLQkvL0NsaWVudCBDb2RlIGdlbmVyYXRpb24gT3B0aW9ucwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBQUkVGRVJFTkNFX0NMSUVOVF9TWU5DX0RFRkFVTFQgPSAgZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIFBSRUZFUkVOQ0VfQ0xJRU5UX0FTWU5DX0RFRkFVTFQgPSAgZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9DTElFTlRfREFUQUJJTkRJTkdfREVGQVVMVCAgPSBBeGlzMkNvbnN0YW50cy5BREI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIFBSRUZFUkVOQ0VfQ0xJRU5UX1RFU1RDQVNFX0RFRkFVTFQgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gUFJFRkVSRU5DRV9DTElFTlRfR0VORVJBVEVfQUxMX0RFRkFVTFQgPSBmYWxzZTsKLQotCS8vU2VydmljZSBBcmNoaXZlIE9wdGlvbnMKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgUFJFRkVSRU5DRV9BQVJfRVhURU5USU9OX0RFRkFVTFQgID0gQXhpczJDb25zdGFudHMuQUFSOwkvL2FhckV4dGVudGlvbgotCi0KLQkvKioKLQkgKiBAcmV0dXJuIHJldHVybnMgdGhlIGRlZmF1bHQgc2V0dGluZyBmb3IgcnVudGltZSBsb2NhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBeGlzMlJ1bnRpbWVMb2NhdGlvbigpIHsKLQkJcmV0dXJuIFBSRUZFUkVOQ0VfQVhJUzJfUlVOVElNRV9MT0NBVElPTl9ERUZBVUxUOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBeGlzMlNlcnZlclBhdGhSZXByZXNlbnRzV2FyKCkgewotCQlyZXR1cm4gUFJFRkVSRU5DRV9BWElTMl9TRVJWRVJfSVNfV0FSOwotCX0KLQotCi0JLy9TZXJ2aWNlIENvZGUgZ2VuZXJhdGlvbiBPcHRpb25zCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZXJ2aWNlRGF0YWJpbmRpbmcoKXsKLQkJcmV0dXJuIFBSRUZFUkVOQ0VfU0VSVklDRV9EQVRBQklORElOR19ERUZBVUxUOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NlcnZpY2VJbnRlcmZhY2VTa2VsZXRvbigpewotCQlyZXR1cm4gUFJFRkVSRU5DRV9TRVJWSUNFX0lOVEVSRkFDRV9TS0VMRVRPTl9ERUZBVUxUOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NlcnZpY2VHZW5lcmF0ZUFsbCgpewotCQlyZXR1cm4gUFJFRkVSRU5DRV9TRVJWSUNFX0dFTkVSQVRFX0FMTF9ERUZBVUxUOwotCX0KLQotCi0JLy9DbGllbnQgQ29kZSBnZW5lcmF0aW9uIE9wdGlvbnMKLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NsaWVudFN5bmMoKXsKLQkJcmV0dXJuIFBSRUZFUkVOQ0VfQ0xJRU5UX1NZTkNfREVGQVVMVDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDbGllbnRBc3luYygpewotCQlyZXR1cm4gUFJFRkVSRU5DRV9DTElFTlRfQVNZTkNfREVGQVVMVDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDbGllbnREYXRhYmluZGluZygpewotCQlyZXR1cm4gUFJFRkVSRU5DRV9DTElFTlRfREFUQUJJTkRJTkdfREVGQVVMVDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDbGllbnRUZXN0Q2FzZSgpewotCQlyZXR1cm4gUFJFRkVSRU5DRV9DTElFTlRfVEVTVENBU0VfREVGQVVMVDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDbGllbnRHZW5lcmF0ZUFsbCgpewotCQlyZXR1cm4gUFJFRkVSRU5DRV9DTElFTlRfR0VORVJBVEVfQUxMX0RFRkFVTFQ7Ci0JfQotCi0JLy9TZXJ2aWNlIEFBUiBPcHRpb25zCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWFyRXh0ZW50aW9uKCl7Ci0JCXJldHVybiBQUkVGRVJFTkNFX0FBUl9FWFRFTlRJT05fREVGQVVMVDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb3JlL2NvbnRleHQvUGVyc2lzdGVudEF4aXMyRW1pdHRlckNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb3JlL2NvbnRleHQvUGVyc2lzdGVudEF4aXMyRW1pdHRlckNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI2ZmUxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29yZS9jb250ZXh0L1BlcnNpc3RlbnRBeGlzMkVtaXR0ZXJDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDUxNiAgIDE4MzE0NyBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoIEZpeCBmb3IgdGhlIHBlcnNpc3RpbmcgREJDUyBwYXRocwotICogMjAwNzA1MjMgICAxNzQ4NzYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgUGVyc2lzdCBQcmVmZXJlbmNlcyBpbnNpZGUgRnJhbWV3b3JrCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5wbHVnaW4uV2ViU2VydmljZUF4aXMyQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29udGV4dC5QZXJzaXN0ZW50Q29udGV4dDsKLQotcHVibGljIGNsYXNzIFBlcnNpc3RlbnRBeGlzMkVtaXR0ZXJDb250ZXh0IGV4dGVuZHMgUGVyc2lzdGVudENvbnRleHQgaW1wbGVtZW50cwotCQlBeGlzMkVtaXR0ZXJDb250ZXh0IHsKLQotCXByaXZhdGUgc3RhdGljIFBlcnNpc3RlbnRBeGlzMkVtaXR0ZXJDb250ZXh0IGNvbnRleHRfID0gbnVsbDsKLQotCXB1YmxpYyBzdGF0aWMgUGVyc2lzdGVudEF4aXMyRW1pdHRlckNvbnRleHQgZ2V0SW5zdGFuY2UoKSAKLQl7Ci0JCWlmIChjb250ZXh0XyA9PSBudWxsKSB7Ci0JCQljb250ZXh0XyA9IG5ldyBQZXJzaXN0ZW50QXhpczJFbWl0dGVyQ29udGV4dCgpOwotCQkJY29udGV4dF8ubG9hZCgpOwotCQl9Ci0JCXJldHVybiBjb250ZXh0XzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbG9hZCgpewotCQlzZXREZWZhdWx0KFBSRUZFUkVOQ0VfQVhJUzJfUlVOVElNRV9MT0NBVElPTiwgQXhpczJFbWl0dGVyRGVmYXVsdHMuZ2V0QXhpczJSdW50aW1lTG9jYXRpb24oKSk7Ci0JCXNldERlZmF1bHQoUFJFRkVSRU5DRV9BWElTMl9TRVJWRVJfSVNfV0FSLCBBeGlzMkVtaXR0ZXJEZWZhdWx0cy5pc0F4aXMyU2VydmVyUGF0aFJlcHJlc2VudHNXYXIoKSk7Ci0JCS8vc2VydmljZSBkZWZhdWx0cwotCQlzZXREZWZhdWx0KFBSRUZFUkVOQ0VfU0VSVklDRV9EQVRBQklORElORywgQXhpczJFbWl0dGVyRGVmYXVsdHMuZ2V0U2VydmljZURhdGFiaW5kaW5nKCkpOwotCQlzZXREZWZhdWx0KFBSRUZFUkVOQ0VfU0VSVklDRV9JTlRFUkZBQ0VfU0tFTEVUT04sIEF4aXMyRW1pdHRlckRlZmF1bHRzLmlzU2VydmljZUludGVyZmFjZVNrZWxldG9uKCkpOwotCQlzZXREZWZhdWx0KFBSRUZFUkVOQ0VfU0VSVklDRV9HRU5FUkFURV9BTEwsIEF4aXMyRW1pdHRlckRlZmF1bHRzLmlzU2VydmljZUdlbmVyYXRlQWxsKCkpOwotCQkvL2NsaWVudCBkZWZhdWx0cwotCQlzZXREZWZhdWx0KFBSRUZFUkVOQ0VfQ0xJRU5UX1NZTkMsIEF4aXMyRW1pdHRlckRlZmF1bHRzLmlzQ2xpZW50U3luYygpKTsKLQkJc2V0RGVmYXVsdChQUkVGRVJFTkNFX0NMSUVOVF9BU1lOQywgQXhpczJFbWl0dGVyRGVmYXVsdHMuaXNDbGllbnRBc3luYygpKTsKLQkJc2V0RGVmYXVsdChQUkVGRVJFTkNFX0NMSUVOVF9EQVRBQklORElORywgQXhpczJFbWl0dGVyRGVmYXVsdHMuZ2V0Q2xpZW50RGF0YWJpbmRpbmcoKSk7Ci0JCXNldERlZmF1bHQoUFJFRkVSRU5DRV9DTElFTlRfVEVTVENBU0UsIEF4aXMyRW1pdHRlckRlZmF1bHRzLmlzQ2xpZW50VGVzdENhc2UoKSk7Ci0JCXNldERlZmF1bHQoUFJFRkVSRU5DRV9DTElFTlRfR0VORVJBVEVfQUxMLCBBeGlzMkVtaXR0ZXJEZWZhdWx0cy5pc0NsaWVudEdlbmVyYXRlQWxsKCkpOwotCQkvL0FBUiBEZWZhdWx0cwotCQlzZXREZWZhdWx0KFBSRUZFUkVOQ0VfQUFSX0VYVEVOVElPTiwgQXhpczJFbWl0dGVyRGVmYXVsdHMuZ2V0QWFyRXh0ZW50aW9uKCkpOwotCi0JfQotCQotCXByaXZhdGUgUGVyc2lzdGVudEF4aXMyRW1pdHRlckNvbnRleHQoKSAJewotCQlzdXBlcihXZWJTZXJ2aWNlQXhpczJDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXhpczJSdW50aW1lTG9jYXRpb24oKSB7Ci0JCXJldHVybiBnZXRWYWx1ZUFzU3RyaW5nKFBSRUZFUkVOQ0VfQVhJUzJfUlVOVElNRV9MT0NBVElPTik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXhpczJSdW50aW1lTG9jYXRpb24oU3RyaW5nIHJ1bnRpbWVMb2NhdGlvbikgewotCQlzZXRWYWx1ZShQUkVGRVJFTkNFX0FYSVMyX1JVTlRJTUVfTE9DQVRJT04sIHJ1bnRpbWVMb2NhdGlvbik7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzQXhpczJTZXJ2ZXJQYXRoUmVwcmVzZW50c1dhcigpIHsKLQkJcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfQVhJUzJfU0VSVkVSX0lTX1dBUik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXhpczJTZXJ2ZXJQYXRoUmVwcmVzZW50c1dhcihTdHJpbmcgaXNXYXIpIHsKLQkJc2V0VmFsdWUoUFJFRkVSRU5DRV9BWElTMl9TRVJWRVJfSVNfV0FSLCBpc1dhcik7Ci0JfQotCQotCS8vU2VydmljZSAKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VEYXRhYmluZGluZygpIHsKLQkJcmV0dXJuIGdldFZhbHVlQXNTdHJpbmcoUFJFRkVSRU5DRV9TRVJWSUNFX0RBVEFCSU5ESU5HKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2VydmljZURhdGFiaW5kaW5nKFN0cmluZyBzZXJ2aWNlRGF0YWJpbmRpbmcpIHsKLQkJc2V0VmFsdWUoUFJFRkVSRU5DRV9TRVJWSUNFX0RBVEFCSU5ESU5HLCBzZXJ2aWNlRGF0YWJpbmRpbmcpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1NlcnZpY2VJbnRlcmZhY2VTa2VsZXRvbigpIHsKLQkJcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfU0VSVklDRV9JTlRFUkZBQ0VfU0tFTEVUT04pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlSW50ZXJmYWNlU2tlbGV0b24oYm9vbGVhbiBzZXJ2aWNlSW50ZXJmYWNlU2tlbGV0b24pIHsKLQkJc2V0VmFsdWUoUFJFRkVSRU5DRV9TRVJWSUNFX0lOVEVSRkFDRV9TS0VMRVRPTiwgc2VydmljZUludGVyZmFjZVNrZWxldG9uKTsJCi0JfQkKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1NlcnZpY2VHZW5lcmF0ZUFsbCgpIHsKLQkJcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfU0VSVklDRV9HRU5FUkFURV9BTEwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlR2VuZXJhdGVBbGwoYm9vbGVhbiBzZXJ2aWNlR2VuZXJhdGVBbGwpIHsKLQkJc2V0VmFsdWUoUFJFRkVSRU5DRV9TRVJWSUNFX0dFTkVSQVRFX0FMTCwgc2VydmljZUdlbmVyYXRlQWxsKTsKLQl9Ci0JCi0JCi0JLy9DbGllbnQKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1N5bmMoKSB7Ci0JCXJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX0NMSUVOVF9TWU5DKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3luYyhib29sZWFuIGNsaWVudFN5bmMpIHsKLQkJc2V0VmFsdWUoUFJFRkVSRU5DRV9DTElFTlRfU1lOQywgY2xpZW50U3luYyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBc3luYygpIHsKLQkJcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfQ0xJRU5UX0FTWU5DKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0QXN5bmMoYm9vbGVhbiBjbGllbnRBc3luYykgewotCQlzZXRWYWx1ZShQUkVGRVJFTkNFX0NMSUVOVF9BU1lOQywgY2xpZW50QXN5bmMpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldENsaWVudERhdGFiaW5kaW5nKCkgewotCQlyZXR1cm4gZ2V0VmFsdWVBc1N0cmluZyhQUkVGRVJFTkNFX0NMSUVOVF9EQVRBQklORElORyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldENsaWVudERhdGFiaW5kaW5nKFN0cmluZyBjbGllbnREYXRhYmluZGluZykgewotCQlzZXRWYWx1ZShQUkVGRVJFTkNFX0NMSUVOVF9EQVRBQklORElORywgY2xpZW50RGF0YWJpbmRpbmcpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0NsaWVudFRlc3RDYXNlKCkgewotCQlyZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9DTElFTlRfVEVTVENBU0UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRDbGllbnRUZXN0Q2FzZShib29sZWFuIGNsaWVudFRlc3RDYXNlKSB7Ci0JCXNldFZhbHVlKFBSRUZFUkVOQ0VfQ0xJRU5UX1RFU1RDQVNFLCBjbGllbnRUZXN0Q2FzZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDbGllbnRHZW5lcmF0ZUFsbCgpIHsKLQkJcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfQ0xJRU5UX0dFTkVSQVRFX0FMTCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2xpZW50R2VuZXJhdGVBbGwoYm9vbGVhbiBjbGllbnRHZW5yYXRlQWxsKSB7Ci0JCXNldFZhbHVlKFBSRUZFUkVOQ0VfQ0xJRU5UX0dFTkVSQVRFX0FMTCwgY2xpZW50R2VucmF0ZUFsbCk7Ci0JfQotCi0JCi0JLy9BQVIgT3B0aW9ucwotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QWFyRXh0ZW50aW9uKCl7Ci0JCXJldHVybiBnZXRWYWx1ZUFzU3RyaW5nKFBSRUZFUkVOQ0VfQUFSX0VYVEVOVElPTik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEFhckV4dGVudGlvbihTdHJpbmcgYWFyRXh0ZW50aW9uKXsKLQkJc2V0VmFsdWUoUFJFRkVSRU5DRV9BQVJfRVhURU5USU9OLCBhYXJFeHRlbnRpb24pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvcmUvY29udGV4dC9TZXJ2aWNlQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvcmUvY29udGV4dC9TZXJ2aWNlQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmI0MWE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb3JlL2NvbnRleHQvU2VydmljZUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAxMzAgICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSAKLSAqIAkJCQkJCQkJCQkJdGhlIEF4aXMyIHJ1bnRpbWUgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzYyCi0gKiAyMDA3MDUwMiAgIDE4NDMwMiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBGaXggY29weXJpZ2h0IGZvciBBeGlzMiBwbHVnaW5zCi0gKiAyMDA3MDUwOCAgIDE3NTAzMCBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBSZWZhY3RvciBCdVNlcnZpY2VDb250ZXh0IAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLmNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlQ29udGV4dCB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU2VydmljZUNvbnRleHQgaW5zdGFuY2U7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNlcnZpY2VOYW1lOyAKLQkKLQkvL3NpbmdsZXRvbgotCXByaXZhdGUgU2VydmljZUNvbnRleHQoKXt9Ci0JCi0JcHVibGljIHN0YXRpYyBTZXJ2aWNlQ29udGV4dCBnZXRJbnN0YW5jZSgpewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgU2VydmljZUNvbnRleHQoKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlTmFtZSgpIHsKLQkJcmV0dXJuIHNlcnZpY2VOYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VOYW1lKFN0cmluZyBzZXJ2aWNlTmFtZSkgewotCQlTZXJ2aWNlQ29udGV4dC5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOwotCX0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb3JlL3BsdWdpbi9XZWJTZXJ2aWNlQXhpczJDb3JlUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29yZS9wbHVnaW4vV2ViU2VydmljZUF4aXMyQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjNhZGVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb3JlL3BsdWdpbi9XZWJTZXJ2aWNlQXhpczJDb3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAxMzAgICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgQXhpczIgCi0gKiAJCQkJCQkJCQkJICBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotICogMjAwNzA0MjYgICAxODMwNDYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aAotICogMjAwNzA1MTYgICAxODMxNDcgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCBGaXggZm9yIHRoZSBwZXJzaXN0aW5nIERCQ1MgcGF0aHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5wbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLmNvbnRleHQuQXhpczJFbWl0dGVyQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBeGlzMkVtaXR0ZXJDb250ZXh0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZUF4aXMyQ29yZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZSI7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgV2ViU2VydmljZUF4aXMyQ29yZVBsdWdpbiBpbnN0YW5jZV87Ci0JCi0KLQlwcml2YXRlIFBlcnNpc3RlbnRBeGlzMkVtaXR0ZXJDb250ZXh0IGF4aXMyRW1pdHRlckNvbnRleHRfOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBXZWJTZXJ2aWNlQXhpczJDb3JlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpZiAoaW5zdGFuY2VfID09IG51bGwpIHsKLQkJCWluc3RhbmNlXyA9IHRoaXM7Ci0JCX0KLQl9Ci0KLQkKLQlwdWJsaWMgQXhpczJFbWl0dGVyQ29udGV4dCBnZXRBeGlzRW1pdHRlckNvbnRleHQoKXsKLQkJaWYgKGF4aXMyRW1pdHRlckNvbnRleHRfID09IG51bGwpIAotCSAgCQlheGlzMkVtaXR0ZXJDb250ZXh0XyA9IFBlcnNpc3RlbnRBeGlzMkVtaXR0ZXJDb250ZXh0LmdldEluc3RhbmNlKCk7Ci0JCXJldHVybiBheGlzMkVtaXR0ZXJDb250ZXh0XzsKLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2lucyNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWluc3RhbmNlXyA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VBeGlzMkNvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIGluc3RhbmNlXzsKLQl9Ci0JCi0JIC8vIFRoaXMgbWV0aG9kIGlzIG5lZWRlZCB0byBrZWVwIHRoZSBsb2dnaW5nIGZyb20gYmxvd2luZyB1cC4KLQkgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCSAgewotCSAgICByZXR1cm4gUExVR0lOX0lEOyAgCi0JICB9Ci0JICAKLQkJLyoqCi0JCSogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLiBFcXVpdmFsZW50IHRvIGNhbGxpbmcKLQkJKiAoV2ViU2VydmljZVdhc0NvbnN1bXB0aW9uUGx1Z2luKVBsYXRmb3JtLmdldFBsdWdpbigib3JnLmVjbGlwc2UuanN0LndzLndhcy52NS50cCIpOwotCQkqIEByZXR1cm4gVGhlIFdlYlNlcnZpY2VBeGlzQ29uc3VtcHRpb25Db3JlUGx1Z2luIHNpbmdsZXRvbi4KLQkJKi8KLQkJc3RhdGljIHB1YmxpYyBXZWJTZXJ2aWNlQXhpczJDb3JlUGx1Z2luIGdldEluc3RhbmNlKCkgewotCQkJcmV0dXJuIGluc3RhbmNlXzsKLQkJfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29yZS9wbHVnaW4vbWVzc2FnZXMvQXhpczJDb3JlVUkucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb3JlL3BsdWdpbi9tZXNzYWdlcy9BeGlzMkNvcmVVSS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2ZhZDFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb3JlL3BsdWdpbi9tZXNzYWdlcy9BeGlzMkNvcmVVSS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0jIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIDIwMDcwMTEwICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIAotIwkJCQkJCQkJCQkgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSMgMjAwNzA0MjYgICAxODMwNDYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aAotIyAyMDA3MDUwMSAgIDE4MDI4NCBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0jIDIwMDcwNTA4ICAgMTg0NDUwIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGggZml4IDE4NDQ1MCwgbW9yZSBpbmZvcm1hdGlvbiBmb3IgdXNlcgotIyAyMDA3MDUxMSAgIDE4NjQ0MCBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoIGZpeCAxODY0NDAKLSMgMjAwNzA1MTAgICAxNzI5MjYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgRml4IDE3MjkyNiBVc2UgVXRpbCBDbGFzc2VzCi0jIDIwMDcwNTE3ICAgMTg3MzA3IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEZpeCAxODczMDcgUHJvcGVydHkgRmlsZSBGaXgKLSMgMjAwNzA2MDQgICAxOTAwNjcgcG1vb2drQGNhLmlibS5jb20gLSBQZXRlciBNb29nawotIyAyMDA4MDEzMCAgIDIxNjk5NyBrYXRlcEB3c28yLmNvbSAtIEthdGUgUHJpY2UKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotTEFCRUxfQlJPVVNFPUJyb3dzZS4uLgotTEFCRUxfV0VCX1NFUlZJQ0VfQ09ERUdFTj1XZWIgc2VydmljZSBjb2RlIGdlbmVyYXRpb24gb3B0aW9ucwotTEFCRUxfV0VCX1NFUlZJQ0VfQ0xJRU5UX0NPREVHRU49V2ViIHNlcnZpY2UgY2xpZW50IGNvZGUgZ2VuZXJhdGlvbiBvcHRpb25zCi1MQUJFTF9XRUJfU0VSVklDRV9BQVI9V2ViIHNlcnZpY2UgYXJjaGl2ZSBvcHRpb25zCi1MQUJFTF9EQVRBQklORElORz1EZWZhdWx0IERhdGFiaW5kaW5nOgotTEFCRUxfQUFSX0VYVEVOVElPTj1BQVIgZGVmYXVsdCBleHRlbnNpb246Ci1MQUJFTF9BWElTMl9SVU5USU1FX0xPQUQ9QXhpczIgcnVudGltZSBsb2FkZWQgc3VjY2Vzc2Z1bGx5Ci1MQUJFTF9BWElTMl9SVU5USU1FX0xPQURfRVJST1I9RXJyb3Igb2NjdXJyZWQgd2hpbGUgbG9hZGluZyBBeGlzMiBydW50aW1lLiBTZWxlY3QgdGhlIGNvcnJlY3QgQXhpczIgcnVudGltZSBmb2xkZXIuCi1MQUJFTF9HRU5FUkFURV9URVNUQ0FTRV9DQVBUSU9OPUdlbmVyYXRlIGEgSlVuaXQgdGVzdCBjYXNlIHRvIHRlc3QgdGhlIHNlcnZpY2UKLUxBQkVMX0dFTkVSQVRFX1NFUlZFUlNJREVfSU5URVJGQUNFPUdlbmVyYXRlIGFuIGludGVyZmFjZSBmb3IgdGhlIHNrZWxldG9uCi1MQUJFTF9HRU5FUkFURV9BTEw9R2VuZXJhdGUgYWxsIHR5cGVzIGZvciBhbGwgZWxlbWVudHMgcmVmZXJyZWQgdG8gYnkgc2NoZW1hcwotTEFCRUxfQ0xJRU5UX1NJREU9Q2xpZW50IG1vZGUKLUxBQkVMX1NZTkNfQU5EX0FTWU5DPUdlbmVyYXRlIGEgY2xpZW50IHdoaWNoIHN1cHBvcnRzIGJvdGggc3luY2hyb25vdXMgYW5kIGFzeW5jaHJvbm91cyBpbnZvY2F0aW9uCi1MQUJFTF9TWU5DPUdlbmVyYXRlIGEgc3luY2hyb25vdXMgY2xpZW50Ci1MQUJFTF9BU1lOQz1HZW5lcmF0ZSBhbiBhc3luY2hyb25vdXMgY2xpZW50Ci0KLUFYSVMyX0xPQ0FUSU9OPUF4aXMyIFJ1bnRpbWUKLUFYSVMyX1JVTlRJTUU9QXhpczIgUnVudGltZQotQVhJUzJfUFJFRkVSRU5DRVM9QXhpczIgUHJlZmVyZW5jZXMKLUFYSVMyX1JVTlRJTUVfVE9PTFRJUD1TZWxlY3QgdGhlIEF4aXMyIGJpbmFyeSBkaXN0cmlidXRpb24gZm9sZGVyIG9yIHRoZSBmb2xkZXIgd2hpY2ggY29udGFpbnMgdGhlIEF4aXMyIHdhciBkaXN0cmlidXRpb24KLUFYSVMyX1BSRUZFUkVOQ0VTX1RPT0xUSVA9U2VsZWN0IHRoZSBkZWZhdWx0IHByZWZlcmVuY2VzIGZvciBBeGlzMiBydW50aW1lCi1BWElTMl9SVU5USU1FX0xPQ0FUSU9OPUF4aXMyIHJ1bnRpbWUgbG9jYXRpb246Ci1BWElTMl9SVU5USU1FX1BSRUZFUkVOQ0VTPUF4aXMyIFJ1bnRpbWUgUHJlZmVyZW5jZXMKLUxBQkVMX0FYSVMyX1JVTlRJTUVfTk9UX0VYSVQ9U2VsZWN0IHRoZSBsb2NhdGlvbiBvZiB0aGUgQXhpczIgYmluYXJ5IGRpc3RyaWJ1dGlvbiBvciB0aGUgZm9sZGVyIHdoaWNoIGNvbnRhaW5zIHRoZSBBeGlzMiB3YXIgZGlzdHJpYnV0aW9uLiAKLUVSUk9SX0lOVkFMSURfQVhJUzJfU0VSVkVSX0xPQ0FUSU9OPUludmFsaWQgQXhpczIgcnVudGltZSBsb2NhdGlvbgotCi1FUlJPUl9JTlZBTElEX0ZJTEVfUkVBRF9XUklURUw9RXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHJlYWRpbmcgb3Igd3JpdGluZyBmaWxlIHswfQotRVJST1JfU0VSVkVSX0lTX05PVF9TRVQ9VGhlIEF4aXMyIGZhY2V0cyBjYW5ub3QgYmUgaW5zdGFsbGVkIHNpbmNlIHRoZSBBeGlzMiBydW50aW1lIGxvY2F0aW9uIGhhcyBub3QgYmVlbiBzZXQuICBcbkdvIHRvIHRoZSBXZWIgU2VydmljZXMgcHJlZmVyZW5jZSBwYWdlIGFuZCBzZXQgdGhlIEF4aXMyIHJ1bnRpbWUgbG9jYXRpb24gdW5kZXIgQXhpczIgUHJlZmVyZW5jZXMuCi0KLVBST0dSRVNTX0lOU1RBTExfQVhJUzJfUlVOVElNRT1JbnN0YWxsaW5nIEF4aXMyIFJ1bnRpbWUKLVBST0dSRVNTX1VOSU5TVEFMTF9BWElTMl9SVU5USU1FPVVuaW5zdGFsbGluZyB0aGUgQXhpczIgUnVudGltZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvcmUvcGx1Z2luL21lc3NhZ2VzL0F4aXMyQ29yZVVJTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb3JlL3BsdWdpbi9tZXNzYWdlcy9BeGlzMkNvcmVVSU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MWM1ZTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvcmUvcGx1Z2luL21lc3NhZ2VzL0F4aXMyQ29yZVVJTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDExMCAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIAotICogCQkJCQkJCQkJCXRoZSBBeGlzMiBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotICogMjAwNzA0MjYgICAxODMwNDYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aAotICogMjAwNzA1MDEgICAxODAyODQgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aAotICogMjAwNzA1MTEgICAxODY0NDAgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCBmaXggMTg2NDQwCi0gKiAyMDA3MDUxMCAgIDE3MjkyNiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBGaXggMTcyOTI2IFVzZSBVdGlsIENsYXNzZXMKLSAqIDIwMDcwNTE3ICAgMTg3MzA3IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEZpeCAxODczMDcgUHJvcGVydHkgRmlsZSBGaXgKLSAqIDIwMDcwNTE4ICAgICAgICAxODczMTEgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgRml4aW5nIHRlc3QgcmVzb3VyY2UgYWRkaXRpb24KLSAqIDIwMDcwODA4ICAgMTk0OTA2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEZpeGluZyAxOTQ5MDYgUnVudGltZSBsaWIgaXNzdWUKLSAqIDIwMDcwODI0ICAgMjAwNTE1IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIE5PTi1OTFMgbW92ZSB0byBzZXBlcmF0ZSBmaWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUucGx1Z2luLm1lc3NhZ2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIEF4aXMyQ29yZVVJTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gCi0JCQkib3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUucGx1Z2luLm1lc3NhZ2VzLkF4aXMyQ29yZVVJIjsJCS8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQXhpczJDb3JlVUlNZXNzYWdlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfQlJPVVNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX1dFQl9TRVJWSUNFX0NPREVHRU47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfV0VCX1NFUlZJQ0VfQ0xJRU5UX0NPREVHRU47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfV0VCX1NFUlZJQ0VfQUFSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX0FBUl9FWFRFTlRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfREFUQUJJTkRJTkc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfQVhJUzJfUlVOVElNRV9MT0FEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX0FYSVMyX1JVTlRJTUVfTE9BRF9FUlJPUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9BWElTMl9SVU5USU1FX05PVF9FWElUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX0dFTkVSQVRFX1RFU1RDQVNFX0NBUFRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfR0VORVJBVEVfU0VSVkVSU0lERV9JTlRFUkZBQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfR0VORVJBVEVfQUxMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX0NMSUVOVF9TSURFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX1NZTkNfQU5EX0FTWU5DOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX1NZTkM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfQVNZTkM7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVhJUzJfTE9DQVRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVhJUzJfUlVOVElNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBWElTMl9QUkVGRVJFTkNFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBWElTMl9SVU5USU1FX1RPT0xUSVA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVhJUzJfUFJFRkVSRU5DRVNfVE9PTFRJUDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBWElTMl9SVU5USU1FX0xPQ0FUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFYSVMyX1JVTlRJTUVfUFJFRkVSRU5DRVM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9JTlZBTElEX0FYSVMyX1NFUlZFUl9MT0NBVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9JTlZBTElEX0ZJTEVfUkVBRF9XUklURUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfU0VSVkVSX0lTX05PVF9TRVQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQUk9HUkVTU19JTlNUQUxMX0FYSVMyX1JVTlRJTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUFJPR1JFU1NfVU5JTlNUQUxMX0FYSVMyX1JVTlRJTUU7Ci0JCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQXhpczJDb3JlVUlNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvcmUvdXRpbHMvQXhpczJDb3JlVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb3JlL3V0aWxzL0F4aXMyQ29yZVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZjQ5MmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvcmUvdXRpbHMvQXhpczJDb3JlVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAxMzAgICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgQXhpczIgCi0gKiAJCQkJCQkJCQkJICBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotICogMjAwNzA0MjYgICAxODMwNDYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aAotICogMjAwNzA1MDEgICAxODAyODQgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aAotICogMjAwNzA4MjQgICAyMDA1MTUgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgTk9OLU5MUyBtb3ZlIHRvIHNlcGVyYXRlIGZpbGUKLSAqIDIwMDgwNjI1ICAgMjEwODE3IHNhbWluZGF3QHdzbzIuY29tIC0gU2FtaW5kYSBXaWplcmF0bmUsIFNldHRpbmcgdGhlIHByb3h5QmVhbiBhbmQgcHJveHlFbmRQb2ludCB2YWx1ZXMgLSBSZWZhY3RvcmluZwotICogMjAwODA5MjQgICAyNDc5Mjkgc2FtaW5kYXdAd3NvMi5jb20gLSBTYW1pbmRhIFdpamVyYXRuZSwgc291cmNlIGZvbGRlciBub3QgY29ycmVjdGx5IHNldAotICogMjAwOTAzMDcgICAxOTY5NTQgc2FtaW5kYXdAd3NvMi5jb20gLSBTYW1pbmRhIFdpamVyYXRuZSwgU3VwcG9ydCBYTUxCZWFucyBkYXRhIGJpbmRpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS51dGlsczsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb25zdGFudC5BeGlzMkNvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgQXhpczJDb3JlVXRpbHMgewotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gYWxyZWFkeUNvbXB1dGVkVGVtcEF4aXMyRGlyZWN0b3J5ID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRlbXBBeGlzMkRpciA9IG51bGw7Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFJlc291cmNlc0ZvbGRlckFzQ2xhc3NQYXRoKElQcm9qZWN0IHByb2plY3QpewotCQl0cnkgewotCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gKElKYXZhUHJvamVjdClwcm9qZWN0LmdldE5hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpOwotCQkJSUNsYXNzcGF0aEVudHJ5W10gcmF3Q2xhc3NwYXRoID0gamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCQlMaXN0IGxpc3QgPSBuZXcgTGlua2VkTGlzdChqYXZhLnV0aWwuQXJyYXlzLmFzTGlzdChyYXdDbGFzc3BhdGgpKTsKLQkJCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gInJlc291cmNlcyI7Ci0JCQkJSUZvbGRlciByZXNvdXJjZXNGb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcihyZXNvdXJjZU5hbWUpOwotCQkJCWJvb2xlYW4gaXNBbHJlYWR5QWRkZWQ9ZmFsc2U7Ci0JCQkJZm9yKElDbGFzc3BhdGhFbnRyeSBjcGU6cmF3Q2xhc3NwYXRoKXsKLQkJCQkJaXNBbHJlYWR5QWRkZWQ9Y3BlLmdldFBhdGgoKS50b09TU3RyaW5nKCkuZXF1YWxzKHJlc291cmNlc0ZvbGRlci5nZXRGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKSk7Ci0JCQkJCWlmIChpc0FscmVhZHlBZGRlZCkgYnJlYWs7Ci0JCQkJfQotCQkJCWlmICghaXNBbHJlYWR5QWRkZWQpewotCQkJCQlJQ2xhc3NwYXRoRW50cnkgamFyRW50cnkgPSBKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkocmVzb3VyY2VzRm9sZGVyLmdldEZ1bGxQYXRoKCksbnVsbCxudWxsKTsKLQkJCQkJbGlzdC5hZGQoamFyRW50cnkpOwotCQkJCX0KLQkJCUlDbGFzc3BhdGhFbnRyeVtdIG5ld0NsYXNzcGF0aCA9IChJQ2xhc3NwYXRoRW50cnlbXSlsaXN0LnRvQXJyYXkobmV3IElDbGFzc3BhdGhFbnRyeVswXSk7Ci0JCQlqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3Q2xhc3NwYXRoLG51bGwpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlbXBBeGlzMkRpcmVjdG9yeSgpIHsKLQkJaWYgKCFhbHJlYWR5Q29tcHV0ZWRUZW1wQXhpczJEaXJlY3RvcnkpewotCQkJU3RyaW5nW10gbm9kZXMgPSB7QXhpczJDb25zdGFudHMuRElSX0RPVF9NRVRBREFUQSwKLQkJCQkJQXhpczJDb25zdGFudHMuRElSX0RPVF9QTFVHSU5TLAotCQkJCQlBeGlzMkNvbnN0YW50cy5URU1QX0FYSVMyX0ZBQ0VUX0RJUn07Ci0JCQl0ZW1wQXhpczJEaXIgPUZpbGVVdGlscy5hZGROb2Rlc1RvUGF0aCgKLQkJCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSwgbm9kZXMpOyAKLQkJCWFscmVhZHlDb21wdXRlZFRlbXBBeGlzMkRpcmVjdG9yeT0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gdGVtcEF4aXMyRGlyOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZW1wQXhpczJXZWJhcHBGaWxlTG9jYXRpb24oKSB7Ci0JCXJldHVybgotCQlhZGRBbm90aGVyTm9kZVRvUGF0aCh0ZW1wQXhpczJEaXJlY3RvcnkoKSwKLQkJCQlBeGlzMkNvbnN0YW50cy5XRUJBUFBfRVhQTE9ERURfU0VSVkVSX0xPQ0FUSU9OX0ZJTEUpOwotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZW1wUnVudGltZVN0YXR1c0ZpbGVMb2NhdGlvbigpIHsKLQkJcmV0dXJuCi0JCWFkZEFub3RoZXJOb2RlVG9QYXRoKHRlbXBBeGlzMkRpcmVjdG9yeSgpLAotCQkJCUF4aXMyQ29uc3RhbnRzLlNFUlZFUl9TVEFUVVNfTE9DQVRJT05fRklMRSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlbXBXYXJTdGF0dXNGaWxlTG9jYXRpb24oKSB7Ci0JCXJldHVybgotCQlhZGRBbm90aGVyTm9kZVRvUGF0aCh0ZW1wQXhpczJEaXJlY3RvcnkoKSwKLQkJCQlBeGlzMkNvbnN0YW50cy5XQVJfU1RBVFVTX0xPQ0FUSU9OX0ZJTEUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRBbm90aGVyTm9kZVRvUGF0aChTdHJpbmcgY3VycmVudFBhdGgsIFN0cmluZyBuZXdOb2RlKSB7Ci0JCXJldHVybiBjdXJyZW50UGF0aCArIEZpbGUuc2VwYXJhdG9yICsgbmV3Tm9kZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkICB3cml0ZVByb3BlcnR5VG9GaWxlKEZpbGUgZmlsZSxTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVdyaXRlciBvdXQgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcigKLQkJCQkJCW5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpLCAiODg1OV8xIikpOwotCSAgICAgICBvdXQud3JpdGUoa2V5KyI9Iit2YWx1ZSsiXG4iKTsKLQkgICAgICAgb3V0LmNsb3NlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2VydmljZUVuZFBvaW50RnJvbVdTREwoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgc2VydmljZU5hbWUpewotCQlTdHJpbmcgcHJveHlFbmRQb2ludD1udWxsOwotCQl0cnl7Ci0JCQlEb2N1bWVudCBkb2M7Ci0JCQlkb2MgPSBBeGlzMkNvcmVVdGlscy5nZXREb2N1bWVudEZyb21Mb2NhdGlvbihmaWxlTmFtZSk7Ci0JCQlFbGVtZW50IGRvY3VtZW50RWxlbWVudCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJCUhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IHBvcnRFbGVtZW50cz1uZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQotCQkJLy9JdGVyYXRlIHRoZSByb290IGVsZW1lbnQgY2hpbGRyZW4gdG8gZmluZCBzZXJ2aWNlIG5vZGVzCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRvY3VtZW50RWxlbWVudC5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCU5vZGUgc2VydmljZUVsZW1lbnQgPSBkb2N1bWVudEVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpLml0ZW0oaSk7Ci0JCQkJaWYgKHNlcnZpY2VFbGVtZW50LmdldE5vZGVOYW1lKCkuZXF1YWxzKCJ3c2RsOnNlcnZpY2UiKSl7Ci0JCQkJCWlmIChzZXJ2aWNlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKHNlcnZpY2VFbGVtZW50LmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oIm5hbWUiKS5nZXROb2RlVmFsdWUoKSkpewotCi0JCQkJCQkvL2l0ZXJhdGUgdGhlIHNlcnZpY2Ugbm9kZSBjaGlsZHJlbiB0byBmaW5kIHdzZGw6cG9ydCBub2RlcwotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzZXJ2aWNlRWxlbWVudC5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCk7IGorKykgewotCQkJCQkJCU5vZGUgcG9ydEVsZW1lbnQgPSBzZXJ2aWNlRWxlbWVudC5nZXRDaGlsZE5vZGVzKCkuaXRlbShqKTsKLQkJCQkJCQlpZiAocG9ydEVsZW1lbnQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoIndzZGw6cG9ydCIpKXsKLQkJCQkJCQkJU3RyaW5nIHBvcnRCaW5kaW5nPXBvcnRFbGVtZW50LmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oImJpbmRpbmciKS5nZXROb2RlVmFsdWUoKS50b1VwcGVyQ2FzZSgpOwotCQotCQkJCQkJCQkvL2l0ZXJhdGUgdGhlIHBvcnQgbm9kZSBjaGlsZHJlbiB0byBmaW5kIHRoZSBzb2FwIGFkZHJlc3Mgbm9kZQotCQkJCQkJCQlmb3IgKGludCBrID0gMDsgayA8IHBvcnRFbGVtZW50LmdldENoaWxkTm9kZXMoKS5nZXRMZW5ndGgoKTsgaysrKSB7Ci0JCQkJCQkJCQlOb2RlIHNvYXBFbGVtZW50ID0gcG9ydEVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpLml0ZW0oayk7Ci0JCQkJCQkJCQlpZiAoIXNvYXBFbGVtZW50LmdldE5vZGVOYW1lKCkuZXF1YWxzKCIjdGV4dCIpKXsKLQkJCQkJCQkJCQlTdHJpbmcgc29hcExvY2F0aW9uPXNvYXBFbGVtZW50LmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oImxvY2F0aW9uIikuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJCQkJCQkJd2hpbGUgKHBvcnRFbGVtZW50cy5jb250YWluc0tleShwb3J0QmluZGluZykpCi0JCQkJCQkJCQkJCXBvcnRCaW5kaW5nPSJLIitwb3J0QmluZGluZzsKLQkJCQkJCQkJCQlwb3J0RWxlbWVudHMucHV0KHBvcnRCaW5kaW5nLCBzb2FwTG9jYXRpb24pOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJU3RyaW5nIHBvcnRCaW5kVHlwZT0iIjsKLQkJCVN0cmluZyBzb2FwMTFCPSJTT0FQMTFCaW5kaW5nIi50b1VwcGVyQ2FzZSgpOwotCQkJU3RyaW5nIHNvYXAxMkI9IlNPQVAxMkJpbmRpbmciLnRvVXBwZXJDYXNlKCk7Ci0JCQlTdHJpbmcgaHR0cEI9Ikh0dHBCaW5kaW5nIi50b1VwcGVyQ2FzZSgpOwotCQkJU3RyaW5nIGh0dHBzPSJodHRwcyI7Ci0KLQkJCS8vaXRlcmF0aW5nIHRocm91Z2ggYWxsIGZvdW5kIGVuZCBwb2ludHMgdG8gZGV0ZXJtaW5lIHRoZSByZXF1aXJlZCBlbmRwb2ludCBpbiB0aGUgb3JkZXIgc29hcDExLCBzb2FwMTIsIGh0dHAKLQkJCWZvciAoU3RyaW5nIHN0cmluZyA6IHBvcnRFbGVtZW50cy5rZXlTZXQoKSkgewotCQkJCWlmIChwcm94eUVuZFBvaW50PT1udWxsKXsKLQkJCQkJcHJveHlFbmRQb2ludD1wb3J0RWxlbWVudHMuZ2V0KHN0cmluZyk7Ci0JCQkJCXBvcnRCaW5kVHlwZT1zdHJpbmc7Ci0JCQkJfQotCQkJCWlmIChzdHJpbmcuZW5kc1dpdGgoc29hcDExQikpewotCQkJCQlpZiAocHJveHlFbmRQb2ludC5zdGFydHNXaXRoKGh0dHBzKXx8KCFwb3J0QmluZFR5cGUuZW5kc1dpdGgoc29hcDExQikpKXsKLQkJCQkJCXByb3h5RW5kUG9pbnQ9cG9ydEVsZW1lbnRzLmdldChzdHJpbmcpOwotCQkJCQkJcG9ydEJpbmRUeXBlPXN0cmluZzsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoKCFwb3J0QmluZFR5cGUuZW5kc1dpdGgoc29hcDExQikpJiYoc3RyaW5nLmVuZHNXaXRoKHNvYXAxMkIpKSl7Ci0JCQkJCWlmIChwcm94eUVuZFBvaW50LnN0YXJ0c1dpdGgoaHR0cHMpfHwoIXBvcnRCaW5kVHlwZS5lbmRzV2l0aChzb2FwMTJCKSkpewotCQkJCQkJcHJveHlFbmRQb2ludD1wb3J0RWxlbWVudHMuZ2V0KHN0cmluZyk7Ci0JCQkJCQlwb3J0QmluZFR5cGU9c3RyaW5nOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghKChwb3J0QmluZFR5cGUuZW5kc1dpdGgoc29hcDExQikpfHwocG9ydEJpbmRUeXBlLmVuZHNXaXRoKHNvYXAxMkIpKSkmJihzdHJpbmcuZW5kc1dpdGgoaHR0cEIpKSl7Ci0JCQkJCWlmIChwcm94eUVuZFBvaW50LnN0YXJ0c1dpdGgoaHR0cHMpfHwoIXBvcnRCaW5kVHlwZS5lbmRzV2l0aChodHRwQikpKXsKLQkJCQkJCXByb3h5RW5kUG9pbnQ9cG9ydEVsZW1lbnRzLmdldChzdHJpbmcpOwotCQkJCQkJcG9ydEJpbmRUeXBlPXN0cmluZzsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfWNhdGNoKEV4Y2VwdGlvbiBlKXt9Ci0JCXJldHVybiBwcm94eUVuZFBvaW50OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNlcnZpY2VOYW1lRnJvbVdTREwoU3RyaW5nIGZpbGVOYW1lKXsKLQkJU3RyaW5nIHNlcnZpY2VOYW1lPSIiOwotCQl0cnl7Ci0JCQlEb2N1bWVudCBkb2M7Ci0JCQlkb2MgPSBBeGlzMkNvcmVVdGlscy5nZXREb2N1bWVudEZyb21Mb2NhdGlvbihmaWxlTmFtZSk7Ci0JCQlFbGVtZW50IGRvY3VtZW50RWxlbWVudCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQotCQkJLy9JdGVyYXRlIHRoZSByb290IGVsZW1lbnQgY2hpbGRyZW4gdG8gZmluZCBzZXJ2aWNlcwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkb2N1bWVudEVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlOb2RlIHNlcnZpY2VFbGVtZW50ID0gZG9jdW1lbnRFbGVtZW50LmdldENoaWxkTm9kZXMoKS5pdGVtKGkpOwotCQkJCWlmIChzZXJ2aWNlRWxlbWVudC5nZXROb2RlTmFtZSgpLmVxdWFscygid3NkbDpzZXJ2aWNlIikpewotCQkJCQlzZXJ2aWNlTmFtZT1zZXJ2aWNlRWxlbWVudC5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKCJuYW1lIikuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJfQotCQkJfQotCQl9Y2F0Y2goRXhjZXB0aW9uIGUpe30KLQkJcmV0dXJuIHNlcnZpY2VOYW1lOwotCX0gCi0KLQlwcml2YXRlIHN0YXRpYyBEb2N1bWVudCBnZXREb2N1bWVudEZyb21Mb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pewotCQlEb2N1bWVudCBkb2M9bnVsbDsKLQkJRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkYmYgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JCWRiZi5zZXRJZ25vcmluZ0VsZW1lbnRDb250ZW50V2hpdGVzcGFjZSh0cnVlKTsKLQkJZGJmLnNldE5hbWVzcGFjZUF3YXJlKGZhbHNlKTsKLQkJRG9jdW1lbnRCdWlsZGVyIGRiOwotCQl0cnkgewotCQkJZGIgPSBkYmYubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCQlpZiAobG9jYXRpb24udG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKCJIVFRQOiIpKXsKLQkJCQlVUkwgdXJsID0gbmV3IFVSTChsb2NhdGlvbik7Ci0JCQkJZG9jPWRiLnBhcnNlKHVybC5vcGVuU3RyZWFtKCkpOwotCQkJfWVsc2V7Ci0JCQkJaWYgKGxvY2F0aW9uLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aCgiRklMRToiKSkgbG9jYXRpb249bG9jYXRpb24uc3Vic3RyaW5nKDUsbG9jYXRpb24ubGVuZ3RoKCkpOwotCQkJCWRvYz1kYi5wYXJzZShuZXcgRmlsZShsb2NhdGlvbikpOwotCQkJfQkJCi0JCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gZG9jOwotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTb3VyY2VGb2xkZXIoU3RyaW5nIHByb2plY3ROYW1lKXsKLQkJU3RyaW5nIHNyYz1BeGlzMkNvbnN0YW50cy5ESVJfU1JDOwotCQl0cnkgewotCQkJU3RyaW5nW10gamF2YVByb2plY3RTb3VyY2VEaXJlY3RvcmllcyA9IGdldEphdmFQcm9qZWN0U291cmNlRGlyZWN0b3JpZXMocHJvamVjdE5hbWUpOwotCQkJc3JjPWphdmFQcm9qZWN0U291cmNlRGlyZWN0b3JpZXNbMF07Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBzcmM7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0SmF2YVByb2plY3RTb3VyY2VEaXJlY3RvcmllcyAoU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSmF2YU1vZGVsRXhjZXB0aW9uewotCSAgICBBcnJheUxpc3QgcGF0aHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JICAgIAotCSAgICBJUHJvamVjdCBwcm9qZWN0ID1SZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCSAgICBpZiAocHJvamVjdC5pc09wZW4oKSAmJiBKYXZhUHJvamVjdC5oYXNKYXZhTmF0dXJlKHByb2plY3QpKSB7Ci0JICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCSAgICAKLQkgICAgICBJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGhFbnRyaWVzID0gbnVsbDsKLQkgICAgICBjbGFzc3BhdGhFbnRyaWVzID0gamF2YVByb2plY3QuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSk7Ci0JICAgICAgCi0JICAgICAgZm9yIChpbnQgaSA9IDA7IGk8Y2xhc3NwYXRoRW50cmllcy5sZW5ndGg7aSsrKXsgICAgICAgICAKLQkgICAgICAJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gY2xhc3NwYXRoRW50cmllc1tpXTsKLQkgICAgICAgIGlmIChlbnRyeS5nZXRDb250ZW50S2luZCgpID09IElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFKQotCSAgICAgICAgewotCSAgICAgICAgICBJUGF0aCBwYXRoID0gZW50cnkuZ2V0UGF0aCgpOwotCSAgICAgICAgICBTdHJpbmcgc3JjUGF0aCA9IHBhdGguc2VnbWVudHMoKVtwYXRoLnNlZ21lbnRDb3VudCgpLTFdOwotCSAgICAgICAgICBwYXRocy5hZGQoc3JjUGF0aCk7Ci0JICAgICAgICB9Ci0JICAgICAgfQotCSAgICB9Ci0JICAgIHJldHVybiAoU3RyaW5nW10pcGF0aHMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLQkgIH0gCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29yZS91dGlscy9DbGFzc0xvYWRpbmdVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29yZS91dGlscy9DbGFzc0xvYWRpbmdVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZDZlMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvcmUvdXRpbHMvQ2xhc3NMb2FkaW5nVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDEzMCAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiAKLSAqIAkJCQkJCQkJCQkgIHJ1bnRpbWUgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzYyCi0gKiAyMDA3MDQyNiAgIDE4MzA0NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKiAyMDA3MDkxOSAgIDIwMjI5OSBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoIEZpeCBmb3IgQUlPQiBFeHAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS51dGlsczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQW50Q2xhc3NMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOwotCi1wdWJsaWMgY2xhc3MgQ2xhc3NMb2FkaW5nVXRpbCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBheGlzMkNsYXNzUGF0aCA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gY2xhc3NMb2FkUGF0aCA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgaW50IGxpYkNvdW50ID0gMDsKLQlwcml2YXRlIHN0YXRpYyBBbnRDbGFzc0xvYWRlciBhbnRDbGFzc0xvYWRlcjsKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGxpYnNMb2FkZWQgPSBmYWxzZTsKLQlwcml2YXRlIHN0YXRpYyBVUkxbXSB1cmxzID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGFscmVhZHlJbml0ID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpbml0QnlDbGllbnQgPSBmYWxzZTsKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdChTdHJpbmcgcHJvamVjdCkgewotCQlpZiAoIWFscmVhZHlJbml0KSB7Ci0KLQkJLy9PYnRhaW4gYSBhbnQgY2xhc3MgbG9hZGVyIGluc3RhbmNlCi0JCQlpZihhbnRDbGFzc0xvYWRlcj09bnVsbCl7Ci0JCWFudENsYXNzTG9hZGVyID0gIG5ldyBBbnRDbGFzc0xvYWRlcigpOwotCQkJfQotCQkKLQkJLy8gU2V0IHRoZSBjbGFzcyBsb2FkZXIgdG8gY2hpbGQgZmlyc3QKLQkJYW50Q2xhc3NMb2FkZXIuc2V0UGFyZW50Rmlyc3QoZmFsc2UpOwotCQkKLQkJCWlmICgoY2xhc3NMb2FkUGF0aCA9PW51bGwpIHx8ICFsaWJzTG9hZGVkKXsKLQkJCQljbGFzc0xvYWRQYXRoID0gZ2V0QXhpczJMaWJzKHByb2plY3QpOwotCQkJfQotCQkJCi0JCQlpZih1cmxzID09IG51bGwpewotCQkJCXVybHM9IG5ldyBVUkxbY2xhc3NMb2FkUGF0aC5sZW5ndGhdOwotCQkJfWVsc2UgaWYodXJscyAhPSBudWxsICYmICh1cmxzLmxlbmd0aCkhPShjbGFzc0xvYWRQYXRoLmxlbmd0aCkpewotCQkJCXVybHM9IG5ldyBVUkxbY2xhc3NMb2FkUGF0aC5sZW5ndGhdOwotCQkJfQotCi0JCVBhdGggY2xhc3NwYXRoID0gbmV3IFBhdGgobmV3IFByb2plY3QoKSk7Ci0JCQotCQl0cnl7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzTG9hZFBhdGgubGVuZ3RoOyBpKyspIHsKLQkJCQkvL0NyZWF0ZSBhIEZpbGUgb2JqZWN0IG9uIHRoZSByb290IG9mIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgY2xhc3MgZmlsZQotCQkJCWlmKGNsYXNzTG9hZFBhdGhbaV0hPW51bGwpewotCQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShjbGFzc0xvYWRQYXRoW2ldKTsKLQkJCQkJLy8gQ29udmVydCBGaWxlIHRvIGEgVVJMCi0JCQkJCVVSTCB1cmwgPSBmaWxlLnRvVVJMKCk7ICAgICAgICAgIAotCQkJCQl1cmxzW2ldPSB1cmw7Ci0JCQkJCWNsYXNzcGF0aC5zZXRQYXRoKGNsYXNzTG9hZFBhdGhbaV0pOwotCQkJCX0KLQkJCX0KLQkJCQotCQl9Y2F0Y2goTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQkJYW50Q2xhc3NMb2FkZXIuc2V0Q2xhc3NQYXRoKGNsYXNzcGF0aCk7Ci0JCQlhbHJlYWR5SW5pdCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCi0JCi0JcHVibGljIHN0YXRpYyBDbGFzcyBsb2FkQ2xhc3NGcm9tQW50Q2xhc3NMb2FkZXIoU3RyaW5nIGZpbGx5UXVhbGlmaWVkQ2xhc3NOYW1lKXsKLQkJCi0JCUNsYXNzIGNscyA9IG51bGw7Ci0JCXRyeXsJCi0JCQljbHMgPSBhbnRDbGFzc0xvYWRlci5sb2FkQ2xhc3MoZmlsbHlRdWFsaWZpZWRDbGFzc05hbWUpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIGNsczsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZ2V0QXhpczJMaWJzKFN0cmluZyBwcm9qZWN0KXsKLQkJRmlsZSB3ZWJDb250YWluZXJQYXRoID0gbmV3IEZpbGUoRmFjZXRDb250YWluZXJVdGlscy5wYXRoVG9XZWJQcm9qZWN0Q29udGFpbmVyTGliKHByb2plY3QpKTsKLQkJYXhpczJDbGFzc1BhdGggPSBuZXcgU3RyaW5nW3dlYkNvbnRhaW5lclBhdGgubGlzdCgpLmxlbmd0aF07Ci0JCWxpYkNvdW50ID0gMDsKLQkJdmlzaXRBbGxGaWxlcyh3ZWJDb250YWluZXJQYXRoKTsKLQkJcmV0dXJuIGF4aXMyQ2xhc3NQYXRoOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHZpc2l0QWxsRmlsZXMoRmlsZSBkaXIpIHsKLQkJaWYoIWRpci50b1N0cmluZygpLmVuZHNXaXRoKCIudHh0IikpewotCQkJaWYgKGRpci5pc0RpcmVjdG9yeSgpKSB7Ci0KLQkJCQlTdHJpbmdbXSBjaGlsZHJlbiA9IGRpci5saXN0KCk7Ci0JCQkJZm9yIChpbnQgaT0wOyBpPGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXZpc2l0QWxsRmlsZXMobmV3IEZpbGUoZGlyLCBjaGlsZHJlbltpXSkpOwotCQkJCX0KLQotCQkJfSBlbHNlIHsKLQkJCQlheGlzMkNsYXNzUGF0aFtsaWJDb3VudF09ZGlyLmdldEFic29sdXRlUGF0aCgpOwotCQkJCWxpYkNvdW50Kz0xOwotCQkJfQotCi0JCX0KLQkJbGlic0xvYWRlZCA9IHRydWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsZWFuQW50Q2xhc3NMb2FkZXIoKXsKLQkJaWYoaW5pdEJ5Q2xpZW50KXsKLQkJCWFudENsYXNzTG9hZGVyLmNsZWFudXAoKTsKLQkJCWFscmVhZHlJbml0ID0gZmFsc2U7Ci0JCX0KLX0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5pdEJ5Q2xpZW50KGJvb2xlYW4gc3RhdHVzKXsKLQkJaW5pdEJ5Q2xpZW50ID0gc3RhdHVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb3JlL3V0aWxzL0ZhY2V0Q29udGFpbmVyVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jb3JlL3V0aWxzL0ZhY2V0Q29udGFpbmVyVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgwYzE2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29yZS91dGlscy9GYWNldENvbnRhaW5lclV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMjIyICAxNjg3NjYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgQXhpczIgCi0gKiAJCQkJCQkJCQkJICBmYWNldCB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjYKLSAqIDIwMDcwNDI2ICAgMTgzMDQ2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSAqIDIwMDcwNTEwICAgMTcyOTI2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEZpeCAxNzI5MjYgVXNlIFV0aWwgQ2xhc3NlcwotICogMjAwNzA2MDYgICAxNzc0MjEgc2FuZGFraXRoQHdzbzIuY29tIC0gZml4IHdlYi54bWwgd2lwZWQgb3V0IHdoZW4gQXhpczIgZmFjZXQKLSAqIDIwMDcwNjEyICAgMTkyMDQ3IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIDE5MjA0NwotICogMjAwNzA2MTIgICAxOTIwNDcga2F0aHlAY2EuaWJtLmNvbSAgIC0gS2F0aHkgQ2hhbgotICogMjAwNzA4MTMgICAxOTYxNzMgIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEZpeCAxOTYxNzMsIERXUCBjdXN0b20gbG9jYXRpb24gZml4Ci0gKiAyMDA3MDgyNCAgIDIwMDUxNSBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBOT04tTkxTIG1vdmUgdG8gc2VwZXJhdGUgZmlsZQotICogMjAxMDAzMDgJICAyODI0NjYgc2FtaW5kYXdAd3NvMi5jb20gLSBTYW1pbmRhIFdpamVyYXRuZSwgc3VwcG9ydCBmb3IgYXhpczIgMS41Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUudXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLmNvbnN0YW50LkF4aXMyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLnBsdWdpbi5XZWJTZXJ2aWNlQXhpczJDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU2VydmVyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci0KLXB1YmxpYyBjbGFzcyBGYWNldENvbnRhaW5lclV0aWxzIHsKLQkKLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldFdvcmtzcGFjZSgpewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRMb2NhdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGdldFByb2plY3ROYW1lKFN0cmluZyBwcm9qZWN0KXsKLQkJU3RyaW5nIHByb2plY3RTdHJpbmcgPSByZXBsYWNlRXNjYXBlY2hhcmFjdG9ycyhwcm9qZWN0LnRvU3RyaW5nKCkpOwotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KAotCQkJCWdldFByb2plY3ROYW1lRnJvbUZyYW1ld29rTmFtZVN0cmluZyhwcm9qZWN0U3RyaW5nKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0UHJvamVjdFJvb3QoU3RyaW5nIHByb2plY3QpewotCQlTdHJpbmcgcHJvamVjdFN0cmluZyA9IHJlcGxhY2VFc2NhcGVjaGFyYWN0b3JzKHByb2plY3QudG9TdHJpbmcoKSk7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoCi0JCQkJZ2V0UHJvamVjdE5hbWVGcm9tRnJhbWV3b2tOYW1lU3RyaW5nKHByb2plY3RTdHJpbmcpKS5nZXRMb2NhdGlvbigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nICBwYXRoVG9XZWJQcm9qZWN0Q29udGFpbmVyKFN0cmluZyBwcm9qZWN0KSB7Ci0JCUlQYXRoIHByb2plY3RSb290ID0gZ2V0UHJvamVjdFJvb3QocHJvamVjdCk7Ci0JCUlQYXRoIGN1cnJlbnREeW5hbWljV2ViUHJvamVjdERpciA9IEoyRUVVdGlscy5nZXRXZWJDb250ZW50UGF0aCgKLQkJCQlnZXRQcm9qZWN0TmFtZShwcm9qZWN0KSk7Ci0JCUlQYXRoIGN1cnJlbnREeW5hbWljV2ViUHJvamVjdERpcldpdGhvdXRQcm9qZWN0Um9vdCA9IEoyRUVVdGlscy5nZXRXZWJDb250ZW50UGF0aCgKLQkJCQlnZXRQcm9qZWN0TmFtZShwcm9qZWN0KSkucmVtb3ZlRmlyc3RTZWdtZW50cygxKS5tYWtlQWJzb2x1dGUoKTsKLQkJaWYocHJvamVjdFJvb3QudG9PU1N0cmluZygpLmNvbnRhaW5zKGdldFdvcmtzcGFjZSgpLnRvT1NTdHJpbmcoKSkpewotCQkJcmV0dXJuIGdldFdvcmtzcGFjZSgpCi0JCQkJCQkuYXBwZW5kKGN1cnJlbnREeW5hbWljV2ViUHJvamVjdERpcikudG9PU1N0cmluZygpOwotCQl9ZWxzZXsKLQkJCXJldHVybiBwcm9qZWN0Um9vdAotCQkJCQkJLmFwcGVuZChjdXJyZW50RHluYW1pY1dlYlByb2plY3REaXJXaXRob3V0UHJvamVjdFJvb3QpLnRvT1NTdHJpbmcoKTsKLQkJfQotCQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgIHBhdGhUb1dlYlByb2plY3RDb250YWluZXJXRUJJTkYoU3RyaW5nIHByb2plY3QpIHsKLQkJSVBhdGggcHJvamVjdFJvb3QgPSBnZXRQcm9qZWN0Um9vdChwcm9qZWN0KTsKLQkJSVBhdGggd2ViQ29udGFpbmVyV0VCSU5GRGlyID0gSjJFRVV0aWxzLmdldFdlYkluZlBhdGgoCi0JCQkJZ2V0UHJvamVjdE5hbWUocHJvamVjdCkpOwotCQlJUGF0aCB3ZWJDb250YWluZXJXRUJJTkZEaXJXaXRob3V0UHJvamVjdFJvb3QgPSBKMkVFVXRpbHMuZ2V0V2ViSW5mUGF0aCgKLQkJCQlnZXRQcm9qZWN0TmFtZShwcm9qZWN0KSkucmVtb3ZlRmlyc3RTZWdtZW50cygxKS5tYWtlQWJzb2x1dGUoKTsKLQkJaWYocHJvamVjdFJvb3QudG9PU1N0cmluZygpLmNvbnRhaW5zKGdldFdvcmtzcGFjZSgpLnRvT1NTdHJpbmcoKSkpewotCQkJcmV0dXJuIGdldFdvcmtzcGFjZSgpCi0JCQkJCQkuYXBwZW5kKHdlYkNvbnRhaW5lcldFQklORkRpcikudG9PU1N0cmluZygpOwotCQl9ZWxzZXsKLQkJCXJldHVybiBwcm9qZWN0Um9vdAotCQkJCQkJLmFwcGVuZCh3ZWJDb250YWluZXJXRUJJTkZEaXJXaXRob3V0UHJvamVjdFJvb3QpLnRvT1NTdHJpbmcoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyAgcGF0aFRvV2ViUHJvamVjdENvbnRhaW5lck1FVEFJTkYoU3RyaW5nIHByb2plY3QpIHsKLQkJU3RyaW5nIGNvbnRhaW5lckRpcmVjdG9yeSA9IHBhdGhUb1dlYlByb2plY3RDb250YWluZXIocHJvamVjdCk7Ci0JCVN0cmluZyB3ZWJDb250YWluZXJNRVRBSU5GID0gQXhpczJDb25zdGFudHMuRElSX01FVEFfSU5GOwotCQlTdHJpbmcgd2ViQ29udGFpbmVyTUVUQUlORlN0cmluZyA9IEF4aXMyQ29yZVV0aWxzLmFkZEFub3RoZXJOb2RlVG9QYXRoKAotCQkJCQkJCQkJCQkJY29udGFpbmVyRGlyZWN0b3J5LAotCQkJCQkJCQkJCQkJd2ViQ29udGFpbmVyTUVUQUlORik7Ci0JCXJldHVybiB3ZWJDb250YWluZXJNRVRBSU5GU3RyaW5nOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyAgcGF0aFRvV2ViUHJvamVjdENvbnRhaW5lckF4aXMyV2ViKFN0cmluZyBwcm9qZWN0KSB7Ci0JCVN0cmluZyBjb250YWluZXJEaXJlY3RvcnkgPSBwYXRoVG9XZWJQcm9qZWN0Q29udGFpbmVyKHByb2plY3QpOwotCQlTdHJpbmcgd2ViQ29udGFpbmVyQXhpczJXZWIgPSBBeGlzMkNvbnN0YW50cy5ESVJfQVhJUzJfV0VCOwotCQlTdHJpbmcgd2ViQ29udGFpbmVyQXhpczJXZWJTdHJpbmcgPSBBeGlzMkNvcmVVdGlscy5hZGRBbm90aGVyTm9kZVRvUGF0aCgKLQkJCQljb250YWluZXJEaXJlY3RvcnksCi0JCQkJCQkJCQkJCQl3ZWJDb250YWluZXJBeGlzMldlYik7Ci0JCXJldHVybiB3ZWJDb250YWluZXJBeGlzMldlYlN0cmluZzsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGF0aFRvV2ViUHJvamVjdENvbnRhaW5lckxpYihTdHJpbmcgcHJvamVjdCl7Ci0JCVN0cmluZyB3ZWJDb250YWluZXJXRUJJTkZTdHJpbmcgPSBwYXRoVG9XZWJQcm9qZWN0Q29udGFpbmVyV0VCSU5GKHByb2plY3QpOwotCQlyZXR1cm4gIEF4aXMyQ29yZVV0aWxzLmFkZEFub3RoZXJOb2RlVG9QYXRoKAotCQkJCXdlYkNvbnRhaW5lcldFQklORlN0cmluZywKLQkJCQlBeGlzMkNvbnN0YW50cy5ESVJfTElCKTsKLQkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhdGhUb1dlYlByb2plY3RDb250YWluZXJXZWJYTUwoU3RyaW5nIHByb2plY3QpewotCQlTdHJpbmcgd2ViQ29udGFpbmVyV0VCSU5GU3RyaW5nID0gcGF0aFRvV2ViUHJvamVjdENvbnRhaW5lcldFQklORihwcm9qZWN0KTsKLQkJcmV0dXJuICBBeGlzMkNvcmVVdGlscy5hZGRBbm90aGVyTm9kZVRvUGF0aCgKLQkJCQl3ZWJDb250YWluZXJXRUJJTkZTdHJpbmcsCi0JCQkJIndlYi54bWwiKTsKLQl9Ci0JCi0JLy9GaXggZm9yIHRoZSB3aW5kb3dzIGJ1aWxkIG5vdCB3b3JraW5nCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlcGxhY2VFc2NhcGVjaGFyYWN0b3JzKFN0cmluZyB2dWxuYXJhYmxlU3RyaW5nKXsKLQkJaWYgKHZ1bG5hcmFibGVTdHJpbmcuaW5kZXhPZigiLyIpIT0tMSl7Ci0JCQl2dWxuYXJhYmxlU3RyaW5nID0gdnVsbmFyYWJsZVN0cmluZy5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3IuY2hhckF0KDApKTsKLQkJfQotCQlyZXR1cm4gdnVsbmFyYWJsZVN0cmluZzsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFByb2plY3ROYW1lRnJvbUZyYW1ld29rTmFtZVN0cmluZyhTdHJpbmcgZnJhbWV3b3JrUHJvamVjdFN0cmluZyl7Ci0JCWlmIChmcmFtZXdvcmtQcm9qZWN0U3RyaW5nLmluZGV4T2YoZ2V0U3BsaXRDaGFyYWN0b3IoKSk9PSAtMSl7Ci0JCQlyZXR1cm4gZnJhbWV3b3JrUHJvamVjdFN0cmluZzsKLQkJfWVsc2V7Ci0JCQlyZXR1cm4gZnJhbWV3b3JrUHJvamVjdFN0cmluZy5zcGxpdChnZXRTcGxpdENoYXJhY3RvcnMoKSlbMV07Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFNwbGl0Q2hhcmFjdG9yKCl7Ci0JCS8vV2luZG93cyBjaGVjayAoYmVjYXVzZSBmcm9tIGluc2lkZSB3dHAgaW4gcmV0dXJuIEkgcmVjZWl2ZWQgYSBoYXJkIGNvZGVkIHBhdGgpCi0JCWlmIChGaWxlLnNlcGFyYXRvckNoYXIgPT0gJ1xcJyl7Ci0JCQlyZXR1cm4gIlxcIiA7Ci0JCX1lbHNlewotCQkJcmV0dXJuIEZpbGUuc2VwYXJhdG9yOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhdGhUb0F4aXMyQ29yZUZhY2V0VGVtcERpcmVjdG9yeShTdHJpbmcgcHJvamVjdCl7Ci0JLy8KLQkJU3RyaW5nIHBsdWdpbkF4aXMyQ29yZVRlbXBEaXIgPSBXZWJTZXJ2aWNlQXhpczJDb3JlUGx1Z2luCi0gICAgICAgIC5nZXRJbnN0YW5jZSgpLmdldFN0YXRlTG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0JCVN0cmluZyBwcm9qZWN0U3RyaW5nID0gcmVwbGFjZUVzY2FwZWNoYXJhY3RvcnMocHJvamVjdCk7Ci0JCXJldHVybiBGaWxlVXRpbHMuYWRkQW5vdGhlck5vZGVUb1BhdGgocGx1Z2luQXhpczJDb3JlVGVtcERpciwgcHJvamVjdFN0cmluZyk7Ci0JCQotCQkKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFNwbGl0Q2hhcmFjdG9ycygpewotCQkvL1dpbmRvd3MgY2hlY2sgKGJlY2F1c2UgZnJvbSBpbnNpZGUgd3RwIGluIHJldHVybiBJIHJlY2VpdmVkIGEgaGFyZCBjb2RlZCBwYXRoKQotCQlpZiAoRmlsZS5zZXBhcmF0b3JDaGFyID09ICdcXCcpewotCQkJcmV0dXJuICJcXCIgKyBGaWxlLnNlcGFyYXRvcjsKLQkJfWVsc2V7Ci0JCQlyZXR1cm4gRmlsZS5zZXBhcmF0b3I7Ci0JCX0KLQl9Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVwbG95ZWRXU0RMVVJMKElQcm9qZWN0IHNlcnZlclByb2plY3QsIAotCQkJCQkJCQkJCQlTdHJpbmcgU2VydmVyRmFjdG9yeUlkLCAKLQkJCQkJCQkJCQkJU3RyaW5nIFNlcnZlckluc3RhbmNlSWQsCi0JCQkJCQkJCQkJCVN0cmluZyBzZXJ2aWNlTmFtZSl7IAotCQkvLyBOb3RlIHRoYXQgU2VydmVyQ29yZS5maW5kU2VydmVyKCkgbWlnaHQgcmV0dXJuIG51bGwgaWYgdGhlIHNlcnZlciBjYW5ub3QgYmUgZm91bmQgYW5kCi0JCS8vIFNlcnZlclV0aWxzLmdldEVuY29kZWRXZWJDb21wb25lbnRVUkwoKSBjYW4gaGFuZGxlIG51bGwgc2VydmVyIHByb3Blcmx5IChieSB1c2luZyBTZXJ2ZXJGYWN0b3J5SWQpCi0JCVN0cmluZyBkZXBsb3llZFdTRExVUkxwYXRoID0gbnVsbDsKLQkJSVNlcnZlciBzZXJ2ZXIgPSBudWxsOwotCQlpZiAoU2VydmVySW5zdGFuY2VJZCAhPSBudWxsKSB7Ci0JCQlzZXJ2ZXIgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXIoU2VydmVySW5zdGFuY2VJZCk7Ci0JCX0KLQkJZGVwbG95ZWRXU0RMVVJMcGF0aCA9IFNlcnZlclV0aWxzLmdldEVuY29kZWRXZWJDb21wb25lbnRVUkwoc2VydmVyUHJvamVjdCwgCi0JCQkJU2VydmVyRmFjdG9yeUlkLCBzZXJ2ZXIpOwotCQlpZiAoZGVwbG95ZWRXU0RMVVJMcGF0aCA9PSBudWxsKSB7Ci0JCQlkZXBsb3llZFdTRExVUkxwYXRoID0gQXhpczJDb25zdGFudHMuTE9DQUxfU0VSVkVSX1BPUlQ7Ci0JCX0KLQkJU3RyaW5nW10gZGVwbG95ZWRXU0RMVVJMUGFydHMgPSB7QXhpczJDb25zdGFudHMuU0VSVklDRVMsc2VydmljZU5hbWV9OwotCQlyZXR1cm4gRmlsZVV0aWxzLmFkZE5vZGVzVG9VUkwoZGVwbG95ZWRXU0RMVVJMcGF0aCwgZGVwbG95ZWRXU0RMVVJMUGFydHMpKyI/d3NkbCI7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEF4aXMyV2ViQ29udGFpbmVyTGliUGF0aChJUHJvamVjdCBwcm9qZWN0KXsKLQkJcmV0dXJuIGdldEF4aXMyV2ViQ29udGFpbmVyTGliUGF0aChGYWNldENvbnRhaW5lclV0aWxzLnBhdGhUb1dlYlByb2plY3RDb250YWluZXIoCi0JCQkJcHJvamVjdC50b1N0cmluZygpKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEF4aXMyV2ViQ29udGFpbmVyTGliUGF0aChTdHJpbmcgd2ViY29udGFpbmVyUGF0aCl7Ci0JCXJldHVybiBGaWxlVXRpbHMuYWRkQW5vdGhlck5vZGVUb1BhdGgoZ2V0QXhpczJXZWJDb250YWluZXJXRUJfSU5GUGF0aCh3ZWJjb250YWluZXJQYXRoKSwKLQkJCQlBeGlzMkNvbnN0YW50cy5ESVJfTElCKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXhpczJXZWJDb250YWluZXJ3ZWJpbmZDbGFzc1BhdGgoSVByb2plY3QgcHJvamVjdCl7Ci0JCXJldHVybiBnZXRBeGlzMldlYkNvbnRhaW5lcndlYmluZkNsYXNzUGF0aChGYWNldENvbnRhaW5lclV0aWxzLnBhdGhUb1dlYlByb2plY3RDb250YWluZXIoCi0JCQkJcHJvamVjdC50b1N0cmluZygpKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEF4aXMyV2ViQ29udGFpbmVyd2ViaW5mQ2xhc3NQYXRoKFN0cmluZyB3ZWJjb250YWluZXJQYXRoKXsKLQkJcmV0dXJuIEZpbGVVdGlscy5hZGRBbm90aGVyTm9kZVRvUGF0aChnZXRBeGlzMldlYkNvbnRhaW5lcldFQl9JTkZQYXRoKHdlYmNvbnRhaW5lclBhdGgpLAotCQkJCUF4aXMyQ29uc3RhbnRzLkRJUl9DTEFTU0VTKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXhpczJXZWJDb250YWluZXJSZXBvc2l0b3J5UGF0aChTdHJpbmcgd2ViY29udGFpbmVyUGF0aCl7Ci0JCXJldHVybiBGaWxlVXRpbHMuYWRkQW5vdGhlck5vZGVUb1BhdGgoZ2V0QXhpczJXZWJDb250YWluZXJXRUJfSU5GUGF0aCh3ZWJjb250YWluZXJQYXRoKSwKLQkJCQlBeGlzMkNvbnN0YW50cy5ESVJfU0VSVklDRVMpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBeGlzMldlYkNvbnRhaW5lcldFQl9JTkZQYXRoKFN0cmluZyB3ZWJjb250YWluZXJQYXRoKXsKLQkJcmV0dXJuICBGaWxlVXRpbHMuYWRkQW5vdGhlck5vZGVUb1BhdGgod2ViY29udGFpbmVyUGF0aCxBeGlzMkNvbnN0YW50cy5ESVJfV0VCX0lORik7Ci0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvcmUvdXRpbHMvRmlsZVV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29yZS91dGlscy9GaWxlVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M5YjE5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29yZS91dGlscy9GaWxlVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiwgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBJQk0gQ29ycG9yYXRpb24sIFdTTzIgSW5jLiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogMjAwNzAxMTAgICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgCi0gKiAJCQkJCQkJCQkJICBBeGlzMiBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotICogMjAwNzA0MjYgICAxODMwNDYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aAotICogMjAwNzA3MzAgICAxOTQ3ODYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgYWRkaW5nIHNlcnZsZXRhcGkgamFyIGZpbHRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLnV0aWxzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIEZpbGVVdGlscwotewotCXB1YmxpYyBGaWxlVXRpbHMoKXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weUZpbGUoU3RyaW5nIHNyYywgU3RyaW5nIGRlc3QpIHsKLQkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCQlGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG51bGw7Ci0KLQkJdHJ5Ci0JCXsKLQkJCWlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzcmMpOwotCQkJZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVzdCk7Ci0JCQlpbnQgYyA9IDA7Ci0JCQlieXRlW10gYXJyYXkgPSBuZXcgYnl0ZVsxMDI0XTsKLQkJCXdoaWxlICgoYyA9IGlzLnJlYWQoYXJyYXkpKSA+PSAwKXsKLQkJCQlmb3Mud3JpdGUoYXJyYXksIDAsIGMpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkJewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlmaW5hbGx5CXsKLQkJCXRyeQl7Ci0JCQkJZm9zLmNsb3NlKCk7Ci0JCQkJaXMuY2xvc2UoKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkJewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEZpbGUgY3JlYXRlRmlsZUFuZFBhcmVudERpcmVjdG9yaWVzKFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKLQkJRmlsZSBwYXJlbnQgPSBmaWxlLmdldFBhcmVudEZpbGUoKTsKLQkJaWYgKCFwYXJlbnQuZXhpc3RzKCkpewotCQkJcGFyZW50Lm1rZGlycygpOwotCQl9Ci0JCWZpbGUuY3JlYXRlTmV3RmlsZSgpOwotCQlyZXR1cm4gZmlsZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGRlbGV0ZURpcihGaWxlIGRpcikgewotICAgICAgICBpZiAoZGlyLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIGNoaWxkcmVuID0gZGlyLmxpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IGRlbGV0ZURpcihuZXcgRmlsZShkaXIsIGNoaWxkcmVuW2ldKSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRpci5kZWxldGUoKTsKLSAgICB9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlRGlyZWN0b3JpZXMoRmlsZSBkaXIpIHsKLQkJRmlsZVtdIGNoaWxkcmVuID0gZGlyLmxpc3RGaWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKXsKLQkJCWlmIChjaGlsZHJlbltpXS5saXN0KCkgIT0gbnVsbCAmJiBjaGlsZHJlbltpXS5saXN0KCkubGVuZ3RoID4gMCl7Ci0JCQkJZGVsZXRlRGlyZWN0b3JpZXMoY2hpbGRyZW5baV0pOwotCQkJfQotCQkJZWxzZXsKLQkJCQljaGlsZHJlbltpXS5kZWxldGUoKTsKLQkJCX0KLQkJfQotCQlkaXIuZGVsZXRlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZURpcmVjdG9yaWVzKFN0cmluZyBkaXIpIHsKLQkJRmlsZSBkaXJlY3RvcnkgPSBuZXcgRmlsZShkaXIpOwotCQlkZWxldGVEaXJlY3RvcmllcyhkaXJlY3RvcnkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVUYXJnZXRGaWxlKFN0cmluZyBzb3VyY2VGaWxlTmFtZSwgU3RyaW5nIHRhcmdldEZpbGVOYW1lKSAKLQkJCQkJCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGFyZ2V0RmlsZShzb3VyY2VGaWxlTmFtZSwgdGFyZ2V0RmlsZU5hbWUsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlVGFyZ2V0RmlsZShTdHJpbmcgc291cmNlRmlsZU5hbWUsIFN0cmluZyB0YXJnZXRGaWxlTmFtZSwgCi0JCQkJCQlib29sZWFuIG92ZXJ3cml0ZSkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJRmlsZSBpZGVhbFJlc3VsdEZpbGUgPSBuZXcgRmlsZSh0YXJnZXRGaWxlTmFtZSk7Ci0JCWlmIChvdmVyd3JpdGUgfHwgIWlkZWFsUmVzdWx0RmlsZS5leGlzdHMoKSkKLQkJewotCQkJRmlsZVV0aWxzLmNyZWF0ZUZpbGVBbmRQYXJlbnREaXJlY3Rvcmllcyh0YXJnZXRGaWxlTmFtZSk7Ci0JCQlGaWxlVXRpbHMuY29weUZpbGUoc291cmNlRmlsZU5hbWUsIHRhcmdldEZpbGVOYW1lKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjcmVhdGVEaXJlY3RvcnkoU3RyaW5nIGRpcmVjdG9yeSl7Ci0JCS8vIENyZWF0ZSBhIGRpcmVjdG9yeTsgYWxsIGFuY2VzdG9yIGRpcmVjdG9yaWVzIG11c3QgZXhpc3QKLQkJYm9vbGVhbiBzdWNjZXNzID0gKG5ldyBGaWxlKGRpcmVjdG9yeSkpLm1rZGlyKCk7Ci0JCWlmICghc3VjY2VzcykgewotCQkJLy8gRGlyZWN0b3J5IGNyZWF0aW9uIGZhaWxlZAotCQl9Ci0JCXJldHVybiBzdWNjZXNzOyAgCi0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNyZWF0ZURpcmVjdG9yeXMoU3RyaW5nIGRpcmVjdG9yeSl7Ci0JCS8vIENyZWF0ZSBhIGRpcmVjdG9yeTsgYWxsIGFuY2VzdG9yIGRpcmVjdG9yaWVzIG11c3QgZXhpc3QKLQkJYm9vbGVhbiBzdWNjZXNzID0gKG5ldyBGaWxlKGRpcmVjdG9yeSkpLm1rZGlycygpOwotCQlpZiAoIXN1Y2Nlc3MpIHsKLQkJCS8vIERpcmVjdG9yeSBjcmVhdGlvbiBmYWlsZWQKLQkJfQotCQlyZXR1cm4gc3VjY2VzczsgIAotCX0KLQotCS8vQ29waWVzIGFsbCBmaWxlcyB1bmRlciBzcmNEaXIgdG8gZHN0RGlyLgotCS8vIElmIGRzdERpciBkb2VzIG5vdCBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkLgotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5RGlyZWN0b3J5KEZpbGUgc3JjRGlyLCBGaWxlIGRzdERpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKHNyY0Rpci5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlpZiAoIWRzdERpci5leGlzdHMoKSkgewotCQkJCWRzdERpci5ta2RpcigpOwotCQkJfQotCi0JCQlTdHJpbmdbXSBjaGlsZHJlbiA9IHNyY0Rpci5saXN0KCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8Y2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQljb3B5RGlyZWN0b3J5KG5ldyBGaWxlKHNyY0RpciwgY2hpbGRyZW5baV0pLAotCQkJCQkJbmV3IEZpbGUoZHN0RGlyLCBjaGlsZHJlbltpXSkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJY29weShzcmNEaXIsIGRzdERpcik7Ci0JCX0KLQl9Ci0KLQkvL0NvcGllcyBzcmMgZmlsZSB0byBkc3QgZmlsZS4KLQkvLyBJZiB0aGUgZHN0IGZpbGUgZG9lcyBub3QgZXhpc3QsIGl0IGlzIGNyZWF0ZWQKLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weShGaWxlIHNyYywgRmlsZSBkc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzcmMpOwotCQlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZHN0KTsKLQotCQkvLyBUcmFuc2ZlciBieXRlcyBmcm9tIGluIHRvIG91dAotCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbMTAyNF07Ci0JCWludCBsZW47Ci0JCXdoaWxlICgobGVuID0gaW4ucmVhZChidWYpKSA+IDApIHsKLQkJCW91dC53cml0ZShidWYsIDAsIGxlbik7Ci0JCX0KLQkJaW4uY2xvc2UoKTsKLQkJb3V0LmNsb3NlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkQW5vdGhlck5vZGVUb1BhdGgoU3RyaW5nIGN1cnJlbnRQYXRoLCBTdHJpbmcgbmV3Tm9kZSkgewotCQlyZXR1cm4gY3VycmVudFBhdGggKyBGaWxlLnNlcGFyYXRvciArIG5ld05vZGU7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZE5vZGVzVG9QYXRoKFN0cmluZyBjdXJyZW50UGF0aCwgU3RyaW5nW10gbmV3Tm9kZSkgewotCQlTdHJpbmcgcmV0dXJuUGF0aD1jdXJyZW50UGF0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdOb2RlLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZXR1cm5QYXRoID0gcmV0dXJuUGF0aCArIEZpbGUuc2VwYXJhdG9yICsgbmV3Tm9kZVtpXTsKLQkJfQotCQlyZXR1cm4gcmV0dXJuUGF0aDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkTm9kZXNUb1BhdGgoU3RyaW5nQnVmZmVyIGN1cnJlbnRQYXRoLCBTdHJpbmdbXSBwYXRoTm9kZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRoTm9kZXMubGVuZ3RoOyBpKyspewotCQkJY3VycmVudFBhdGguYXBwZW5kKEZpbGUuc2VwYXJhdG9yKTsKLQkJCWN1cnJlbnRQYXRoLmFwcGVuZChwYXRoTm9kZXNbaV0pOwotCQl9Ci0JCXJldHVybiBjdXJyZW50UGF0aC50b1N0cmluZygpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGROb2Rlc1RvVVJMKFN0cmluZyBjdXJyZW50UGF0aCwgU3RyaW5nW10gbmV3Tm9kZSkgewotCQlTdHJpbmcgcmV0dXJuUGF0aD1jdXJyZW50UGF0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdOb2RlLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZXR1cm5QYXRoID0gcmV0dXJuUGF0aCArICIvIiArIG5ld05vZGVbaV07Ci0JCX0KLQkJcmV0dXJuIHJldHVyblBhdGg7Ci0JfQotCQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbGlzdCBvZiBmaWxlIHdpdGggYSBwcmVmaXggb2YgPGNvZGU+ZmlsZU5hbWVQcmVmaXg8L2NvZGU+ICZhbXA7IGFuIGV4dGVuc2lvbiBvZgotICAgICAqIDxjb2RlPmV4dGVuc2lvbjwvY29kZT4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzb3VyY2VEaXIgICAgICBUaGUgZGlyZWN0b3J5IGluIHdoaWNoIHRvIHNlYXJjaCB0aGUgZmlsZXMKLSAgICAgKiBAcGFyYW0gZmlsZU5hbWVQcmVmaXggVGhlIHByZWZpeCB0byBsb29rIGZvcgotICAgICAqIEBwYXJhbSBleHRlbnNpb24gICAgICBUaGUgZXh0ZW5zaW9uIHRvIGxvb2sgZm9yCi0gICAgICogQHJldHVybiBUaGUgbGlzdCBvZiBmaWxlIHdpdGggYSBwcmVmaXggb2YgPGNvZGU+ZmlsZU5hbWVQcmVmaXg8L2NvZGU+ICZhbXA7IGFuIGV4dGVuc2lvbiBvZgotICAgICAqICAgICAgICAgPGNvZGU+ZXh0ZW5zaW9uPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRmlsZVtdIGdldE1hdGNoaW5nRmlsZXMoU3RyaW5nIHNvdXJjZURpciwgU3RyaW5nIGZpbGVOYW1lUHJlZml4LCBTdHJpbmcgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIExpc3QgZmlsZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIEZpbGUgbGliRGlyID0gbmV3IEZpbGUoc291cmNlRGlyKTsKLSAgICAgICAgU3RyaW5nIGxpYkRpclBhdGggPSBsaWJEaXIuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgIFN0cmluZ1tdIGl0ZW1zID0gbGliRGlyLmxpc3QoKTsKLSAgICAgICAgaWYgKGl0ZW1zICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaXRlbSA9IGl0ZW1zW2ldOwotICAgICAgICAgICAgICAgIGlmIChmaWxlTmFtZVByZWZpeCAhPSBudWxsICYmIGV4dGVuc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLnN0YXJ0c1dpdGgoZmlsZU5hbWVQcmVmaXgpICYmIGl0ZW0uZW5kc1dpdGgoZXh0ZW5zaW9uKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUxpc3QuYWRkKG5ldyBGaWxlKGxpYkRpclBhdGggKyBGaWxlLnNlcGFyYXRvciArIGl0ZW0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsZU5hbWVQcmVmaXggPT0gbnVsbCAmJiBleHRlbnNpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5lbmRzV2l0aChleHRlbnNpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlTGlzdC5hZGQobmV3IEZpbGUobGliRGlyUGF0aCArIEZpbGUuc2VwYXJhdG9yICsgaXRlbSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWxlTmFtZVByZWZpeCAhPSBudWxsICYmIGV4dGVuc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLnN0YXJ0c1dpdGgoZmlsZU5hbWVQcmVmaXgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlTGlzdC5hZGQobmV3IEZpbGUobGliRGlyUGF0aCArIEZpbGUuc2VwYXJhdG9yICsgaXRlbSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZmlsZUxpc3QuYWRkKG5ldyBGaWxlKGxpYkRpclBhdGggKyBGaWxlLnNlcGFyYXRvciArIGl0ZW0pKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gKEZpbGVbXSkgZmlsZUxpc3QudG9BcnJheShuZXcgRmlsZVtmaWxlTGlzdC5zaXplKCldKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IEZpbGVbMF07Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEZpbHRlciBvdXQgZmlsZXMgaW5zaWRlIGEgPGNvZGU+c291cmNlRGlyPC9jb2RlPiB3aXRoIG1hdGNoaW5nIDxjb2RlZmlsZU5hbWVQcmVmaXg+PC9jb2RlPgotICAgICAqIGFuZCA8Y29kZT5leHRlbnNpb248L2NvZGU+Ci0gICAgICogQHBhcmFtIHNvdXJjZURpciAJCVRoZSBkaXJlY3RvcnkgdG8gZmlsdGVyIHRoZSBmaWxlcwotICAgICAqIEBwYXJhbSBmaWxlTmFtZVByZWZpeAlUaGUgZmlsdGVyaW5nIGZpbGVuYW1lIHByZWZpeCAKLSAgICAgKiBAcGFyYW0gZXh0ZW5zaW9uCQkJVGhlIGZpbHRlcmluZyBmaWxlIGV4dGVuc2lvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmaWx0ZXJPdXRSZXN0cmljdGVkRmlsZXMoU3RyaW5nIHNvdXJjZURpciwgU3RyaW5nIGZpbGVOYW1lUHJlZml4LCBTdHJpbmcgZXh0ZW5zaW9uKXsKLSAgICAJRmlsZVtdIHJlc3VsdGVkTWF0Y2hpbmdGaWxlcyA9IGdldE1hdGNoaW5nRmlsZXMoc291cmNlRGlyLCBmaWxlTmFtZVByZWZpeCwgZXh0ZW5zaW9uKTsKLSAgICAJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHRlZE1hdGNoaW5nRmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCUZpbGUgbWF0Y2hpbmdGaWxlUGF0aCA9IG5ldyBGaWxlKHJlc3VsdGVkTWF0Y2hpbmdGaWxlc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQltYXRjaGluZ0ZpbGVQYXRoLmRlbGV0ZSgpOwotCQl9Ci0gICAgfQotICAgIAotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29yZS91dGlscy9SdW50aW1lUHJvcGVydHlVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NvcmUvdXRpbHMvUnVudGltZVByb3BlcnR5VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QzYTI5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY29yZS91dGlscy9SdW50aW1lUHJvcGVydHlVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDEzMCAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiAKLSAqIAkJCQkJCQkJCQkgIHJ1bnRpbWUgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzYyCi0gKiAyMDA3MDQyNiAgIDE4MzA0NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKiAyMDA3MDUwMSAgIDE4MDI4NCBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKiAyMDA3MDgyNCAgIDIwMDUxNSBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBOT04tTkxTIG1vdmUgdG8gc2VwZXJhdGUgZmlsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLnV0aWxzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLmNvbnN0YW50LkF4aXMyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLnBsdWdpbi5tZXNzYWdlcy5BeGlzMkNvcmVVSU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgUnVudGltZVByb3BlcnR5VXRpbHMgewotCXByaXZhdGUgc3RhdGljIEZpbGUgUHJvcGVydGllc0ZpbGVEaXIsc2VydmVyUHJvcGVydGllc0ZpbGUsc3RhdHVzUHJvcGVydHlGaWxlLHdhclByb3BlcnR5RmlsZTsKLQlwcml2YXRlIHN0YXRpYyBJU3RhdHVzIHN0YXR1czsKLQlwcml2YXRlIHN0YXRpYyBQcm9wZXJ0aWVzIHByb3BlcnRpZXM7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0KCl7Ci0JCVByb3BlcnRpZXNGaWxlRGlyID0gbmV3IEZpbGUoQXhpczJDb3JlVXRpbHMudGVtcEF4aXMyRGlyZWN0b3J5KCkpOwotCQlpZiAoIVByb3BlcnRpZXNGaWxlRGlyLmV4aXN0cygpKXsKLQkJCVByb3BlcnRpZXNGaWxlRGlyLm1rZGlycygpOwotCQl9Ci0JCXByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHNlcnZlclByb3BlcnRpZXNGaWxlSW5pdCgpIHRocm93cyBJT0V4Y2VwdGlvbnsKLQkJc2VydmVyUHJvcGVydGllc0ZpbGUgPSBuZXcgRmlsZShBeGlzMkNvcmVVdGlscy50ZW1wQXhpczJXZWJhcHBGaWxlTG9jYXRpb24oKSk7Ci0JCWlmICghc2VydmVyUHJvcGVydGllc0ZpbGUuZXhpc3RzKCkpewotCQkJc2VydmVyUHJvcGVydGllc0ZpbGUuY3JlYXRlTmV3RmlsZSgpOwotCQl9Ci0JCXByb3BlcnRpZXMubG9hZChuZXcgRmlsZUlucHV0U3RyZWFtKHNlcnZlclByb3BlcnRpZXNGaWxlKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgc3RhdHVzUHJvcGVydGllc0ZpbGVJbml0KCkgdGhyb3dzIElPRXhjZXB0aW9uewotCQlzdGF0dXNQcm9wZXJ0eUZpbGUgPSBuZXcgRmlsZShBeGlzMkNvcmVVdGlscy50ZW1wUnVudGltZVN0YXR1c0ZpbGVMb2NhdGlvbigpKTsKLQkJaWYgKCFzdGF0dXNQcm9wZXJ0eUZpbGUuZXhpc3RzKCkpewotCQkJc3RhdHVzUHJvcGVydHlGaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJfQotCQlwcm9wZXJ0aWVzLmxvYWQobmV3IEZpbGVJbnB1dFN0cmVhbShzdGF0dXNQcm9wZXJ0eUZpbGUpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3YXJQcm9wZXJ0aWVzRmlsZUluaXQoKSB0aHJvd3MgSU9FeGNlcHRpb257Ci0JCXdhclByb3BlcnR5RmlsZSA9IG5ldyBGaWxlKEF4aXMyQ29yZVV0aWxzLnRlbXBXYXJTdGF0dXNGaWxlTG9jYXRpb24oKSk7Ci0JCWlmICghd2FyUHJvcGVydHlGaWxlLmV4aXN0cygpKXsKLQkJCXdhclByb3BlcnR5RmlsZS5jcmVhdGVOZXdGaWxlKCk7Ci0JCX0KLQkJcHJvcGVydGllcy5sb2FkKG5ldyBGaWxlSW5wdXRTdHJlYW0od2FyUHJvcGVydHlGaWxlKSk7Ci0JfQotCQotCQotCQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyB3cml0ZVNlcnZlclBhdGhUb1Byb3BlcnRpZXNGaWxlKFN0cmluZyBheGlzMlBhdGgpIHsKLQkJLy9GaXggZm9yIHByb3BlcnRpZXMgZmlsZSBza2lwcGluZyB0aGUgRmlsZSBzZXBlcmF0b3IgY2hhcmFjdG9yIAotCQkvLyBvbiB3aW5kb3dzIHdoZW4gbG9hZGluZyBhZ2FpbgotCQlTdHJpbmcgYXhpczJQYXRoTmV3ID0gbnVsbDsKLQkJaWYgKChheGlzMlBhdGguaW5kZXhPZigiXFwiKSkgIT0gLTEpIHsKLQkJCWF4aXMyUGF0aE5ldyA9IGF4aXMyUGF0aC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yLCBGaWxlLnNlcGFyYXRvcitGaWxlLnNlcGFyYXRvcik7OwotCQl9ZWxzZXsKLQkJCWF4aXMyUGF0aE5ldz1heGlzMlBhdGg7Ci0JCX0KLQkJdHJ5IHsKLQkJCWluaXQoKTsKLQkJCXNlcnZlclByb3BlcnRpZXNGaWxlSW5pdCgpOwotCQkJaWYoISAocHJvcGVydGllcy5zaXplKCk9PSAwKSl7Ci0JCQkJaWYocHJvcGVydGllcy5jb250YWluc0tleShBeGlzMkNvbnN0YW50cy5QUk9QRVJUWV9LRVlfUEFUSCkpewotCQkJCQlwcm9wZXJ0aWVzLnJlbW92ZShBeGlzMkNvbnN0YW50cy5QUk9QRVJUWV9LRVlfUEFUSCk7Ci0JCQkJfQotCQkJfQotCQkJCUF4aXMyQ29yZVV0aWxzLndyaXRlUHJvcGVydHlUb0ZpbGUoc2VydmVyUHJvcGVydGllc0ZpbGUsIAotCQkJCQkJQXhpczJDb25zdGFudHMuUFJPUEVSVFlfS0VZX1BBVEgsCi0JCQkJCQkJCQkJCQkgICBheGlzMlBhdGhOZXcpOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJdXBkYXRlU3RhdHVzRXJyb3IoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdXBkYXRlU3RhdHVzRXJyb3IoKTsKLQkJfQotCQkKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2VydmVyUGF0aEZyb21Qcm9wZXJ0aWVzRmlsZSgpewotCQlpbml0KCk7Ci0JCVN0cmluZyBzZXJ2ZXJQYXRoID0gbnVsbDsKLQkJc2VydmVyUHJvcGVydGllc0ZpbGUgPSBuZXcgRmlsZShBeGlzMkNvcmVVdGlscy50ZW1wQXhpczJXZWJhcHBGaWxlTG9jYXRpb24oKSk7Ci0JCWlmICghc2VydmVyUHJvcGVydGllc0ZpbGUuZXhpc3RzKCkpewotCQkJdXBkYXRlU3RhdHVzRXJyb3IoKTsJCQkKLQkJfQotCQl0cnkgewotCQkJcHJvcGVydGllcy5sb2FkKG5ldyBGaWxlSW5wdXRTdHJlYW0oc2VydmVyUHJvcGVydGllc0ZpbGUpKTsKLQkJCWlmKHByb3BlcnRpZXMuY29udGFpbnNLZXkoQXhpczJDb25zdGFudHMuUFJPUEVSVFlfS0VZX1BBVEgpKXsKLQkJCQlzZXJ2ZXJQYXRoID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0eShBeGlzMkNvbnN0YW50cy5QUk9QRVJUWV9LRVlfUEFUSCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQl1cGRhdGVTdGF0dXNFcnJvcigpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl1cGRhdGVTdGF0dXNFcnJvcigpOwotCQl9Ci0JCXJldHVybiBzZXJ2ZXJQYXRoOwotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgd3JpdGVTZXJ2ZXJTdGF1c1RvUHJvcGVydGllc0ZpbGUoU3RyaW5nIHJ1bnRpbWVTdGF0dXMpIHsKLQkJdHJ5IHsKLQkJCWluaXQoKTsKLQkJCXN0YXR1c1Byb3BlcnRpZXNGaWxlSW5pdCgpOwotCQkJaWYoISAocHJvcGVydGllcy5zaXplKCk9PSAwKSl7Ci0JCQkJaWYocHJvcGVydGllcy5jb250YWluc0tleShBeGlzMkNvbnN0YW50cy5QUk9QRVJUWV9LRVlfU1RBVFVTKSl7Ci0JCQkJCXByb3BlcnRpZXMucmVtb3ZlKEF4aXMyQ29uc3RhbnRzLlBST1BFUlRZX0tFWV9TVEFUVVMpOwotCQkJCX0KLQkJCX0KLQkJCUF4aXMyQ29yZVV0aWxzLndyaXRlUHJvcGVydHlUb0ZpbGUoc3RhdHVzUHJvcGVydHlGaWxlLCAKLQkJCQkJQXhpczJDb25zdGFudHMuUFJPUEVSVFlfS0VZX1NUQVRVUywgCi0JCSAgICAgICAgICAgIHJ1bnRpbWVTdGF0dXMpOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJdXBkYXRlU3RhdHVzRXJyb3IoKTsgCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXVwZGF0ZVN0YXR1c0Vycm9yKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBzdGF0dXM7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyB3cml0ZVdhclN0YXVzVG9Qcm9wZXJ0aWVzRmlsZShib29sZWFuIHdhclN0YXR1cykgewotCQl0cnkgewotCQkJaW5pdCgpOwotCQkJd2FyUHJvcGVydGllc0ZpbGVJbml0KCk7Ci0JCQlpZighIChwcm9wZXJ0aWVzLnNpemUoKT09IDApKXsKLQkJCQlpZihwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KEF4aXMyQ29uc3RhbnRzLlBST1BFUlRZX0tFWV9TVEFUVVMpKXsKLQkJCQkJcHJvcGVydGllcy5yZW1vdmUoQXhpczJDb25zdGFudHMuUFJPUEVSVFlfS0VZX1NUQVRVUyk7Ci0JCQkJfQotCQkJfQotCQkJQXhpczJDb3JlVXRpbHMud3JpdGVQcm9wZXJ0eVRvRmlsZSh3YXJQcm9wZXJ0eUZpbGUsIAotCQkJCQlBeGlzMkNvbnN0YW50cy5QUk9QRVJUWV9LRVlfU1RBVFVTLCAKLQkJICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2Yod2FyU3RhdHVzKSk7Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQl1cGRhdGVTdGF0dXNFcnJvcigpOyAKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdXBkYXRlU3RhdHVzRXJyb3IoKTsKLQkJfQotCQkKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFdhclN0YXR1c0Zyb21Qcm9wZXJ0aWVzRmlsZSgpewotCQlpbml0KCk7Ci0JCWJvb2xlYW4gd2FyU3RhdHVzID0gZmFsc2U7Ci0JCXdhclByb3BlcnR5RmlsZSA9IG5ldyBGaWxlKEF4aXMyQ29yZVV0aWxzLnRlbXBXYXJTdGF0dXNGaWxlTG9jYXRpb24oKSk7Ci0JCWlmICghd2FyUHJvcGVydHlGaWxlLmV4aXN0cygpKXsKLQkJCXVwZGF0ZVN0YXR1c0Vycm9yKCk7CQkJCi0JCX0KLQkJdHJ5IHsKLQkJCXByb3BlcnRpZXMubG9hZChuZXcgRmlsZUlucHV0U3RyZWFtKHdhclByb3BlcnR5RmlsZSkpOwotCQkJaWYocHJvcGVydGllcy5jb250YWluc0tleShBeGlzMkNvbnN0YW50cy5QUk9QRVJUWV9LRVlfU1RBVFVTKSl7Ci0JCQkJd2FyU3RhdHVzID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4oCi0JCQkJCQlwcm9wZXJ0aWVzLmdldFByb3BlcnR5KEF4aXMyQ29uc3RhbnRzLlBST1BFUlRZX0tFWV9TVEFUVVMpKTsKLQkJCX0KLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCXVwZGF0ZVN0YXR1c0Vycm9yKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXVwZGF0ZVN0YXR1c0Vycm9yKCk7Ci0JCX0KLQkJcmV0dXJuIHdhclN0YXR1czsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHVwZGF0ZVN0YXR1c0Vycm9yKCl7Ci0JCQlzdGF0dXMgPSBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCAKLQkJCQkJImlkIiwgCi0JCQkJCTAsIAotCQkJCQlBeGlzMkNvcmVVSU1lc3NhZ2VzLkVSUk9SX0lOVkFMSURfQVhJUzJfU0VSVkVSX0xPQ0FUSU9OLCAKLQkJCQkJbnVsbCApOyAKLQkJfQotCQkKLQl9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvZmFjZXQvY29tbWFuZHMvQXhpczJXZWJzZXJ2aWNlc1NlcnZlckNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9mYWNldC9jb21tYW5kcy9BeGlzMldlYnNlcnZpY2VzU2VydmVyQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGQ2NjE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9mYWNldC9jb21tYW5kcy9BeGlzMldlYnNlcnZpY2VzU2VydmVyQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDIxMyAgMTY4NzY2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIAotICogCQkJCQkJCQkJCSAgZmFjZXQgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzY2Ci0gKiAyMDA3MDQyNiAgIDE4MzA0NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKiAyMDA3MDUwMSAgIDE4MDI4NCBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKiAyMDA3MDUyMyAgIDE3NDg3NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBQZXJzaXN0IFByZWZlcmVuY2VzIGluc2lkZSBGcmFtZXdvcmsKLSAqIDIwMDcwNjA2ICAgMTc3NDIxIHNhbmRha2l0aEB3c28yLmNvbSAtIGZpeCB3ZWIueG1sIHdpcGVkIG91dCB3aGVuIEF4aXMyIGZhY2V0Ci0gKiAyMDA3MDgwOCAgIDE5NDkwNiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBGaXhpbmcgMTk0OTA2IFJ1bnRpbWUgbGliIGlzc3VlCi0gKiAyMDA3MDgyNCAgIDIwMDUxNSBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBOT04tTkxTIG1vdmUgdG8gc2VwZXJhdGUgZmlsZQotICogMjAwNzEwMTEgICAyMDU5NzIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgQXhpczIgTGlicmFyaWVzIExpY2Vuc2UgZmlsZXMgZml4Ci0gKiAyMDA4MDUyOCAgIDE4NjQyOSBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBBeGlzMiB3ZWJhcHAganNwJ3MgdmFsaWRhdGlvbiBmaXgKLSAqIDIwMDgwNjE2ICAgMjM3MzYzIHNhbWluZGF3QHdzbzIuY29tIC0gU2FtaW5kYSBXaWplcmF0bmUsIGdldCBSZXNvdXJjZUNvbnRleHQgZnJvbSBlbnZpcm9ubWVudCBpbnN0ZWFkIG9mIHByZWZlcmVuY2UKLSAqIDIwMTAwMzA4CSAgMjgyNDY2IHNhbWluZGF3QHdzbzIuY29tIC0gU2FtaW5kYSBXaWplcmF0bmUsIHN1cHBvcnQgZm9yIGF4aXMyIDEuNQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5mYWNldC5jb21tYW5kczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb25zdGFudC5BeGlzMkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb250ZXh0LkF4aXMyRW1pdHRlckNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUucGx1Z2luLldlYlNlcnZpY2VBeGlzMkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUucGx1Z2luLm1lc3NhZ2VzLkF4aXMyQ29yZVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUudXRpbHMuQXhpczJDb3JlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUudXRpbHMuRmFjZXRDb250YWluZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS51dGlscy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUudXRpbHMuUnVudGltZVByb3BlcnR5VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmZhY2V0LnV0aWxzLkF4aXMyUnVudGltZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5mYWNldC51dGlscy5BeGlzMldlYmFwcFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5mYWNldC51dGlscy5Db250ZW50Q29weVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkZyYW1ld29yazsKLQotcHVibGljIGNsYXNzIEF4aXMyV2Vic2VydmljZXNTZXJ2ZXJDb21tYW5kIGV4dGVuZHMKLUFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLQotCUlQcm9qZWN0IHByb2plY3Q7Ci0JQXhpczJFbWl0dGVyQ29udGV4dCBjb250ZXh0OwotCQotCXB1YmxpYyBBeGlzMldlYnNlcnZpY2VzU2VydmVyQ29tbWFuZChJUHJvamVjdCBwcm9qZWN0KXsKLQkJY29udGV4dCA9IFdlYlNlcnZpY2VBeGlzMkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEF4aXNFbWl0dGVyQ29udGV4dCgpOwotCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pCi0JdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQkKLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlT3ZlcnJpZGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSAgewotCQkvL0NvcHkgdGhlIGF4aXMyIGZhY2V0IGluIHRvIHRoaXMgcHJvamVjdAotCQlJU3RhdHVzIHN0YXR1cyA9bnVsbDsKLQkJU3RyaW5nIHJ1bnRpbWVMb2NhdGlvbiA9IG51bGw7Ci0JCUNvbnRlbnRDb3B5VXRpbHMgY29udGVudENvcHlVdGlscyA9IG5ldyBDb250ZW50Q29weVV0aWxzKGdldEVudmlyb25tZW50KCkpOwotCQl0cnkgewotCQkJaWYoY29udGV4dC5pc0F4aXMyU2VydmVyUGF0aFJlcHJlc2VudHNXYXIoKSAKLQkJCQkJfHwgUnVudGltZVByb3BlcnR5VXRpbHMuZ2V0V2FyU3RhdHVzRnJvbVByb3BlcnRpZXNGaWxlKCkpewotCQkJCXJ1bnRpbWVMb2NhdGlvbiA9IEF4aXMyUnVudGltZVV0aWxzLmNvcHlBeGlzMldhcigKLQkJCQkJCQkJCQkJCQkJbW9uaXRvciwKLQkJCQkJCQkJCQkJCQkJQXhpczJDb25zdGFudHMuUFJPUEVSVFlfS0VZX1BBVEgpOwotCQkJfWVsc2V7Ci0KLQkJCQlydW50aW1lTG9jYXRpb24gPSBBeGlzMldlYmFwcFV0aWxzLmNvcHlBeGlzMldhcigKLQkJCQkJCQkJCQkJCQkJbW9uaXRvciwKLQkJCQkJCQkJCQkJCQkJQXhpczJDb25zdGFudHMuUFJPUEVSVFlfS0VZX1BBVEgpOwotCQkJfQotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGhhbmRsZUV4Y2VwdGlvblN0YXR1cyhlKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGhhbmRsZUV4Y2VwdGlvblN0YXR1cyhlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBoYW5kbGVFeGNlcHRpb25TdGF0dXMoZSk7Ci0JCX0KLQkJCi0JCS8vRmlyc3QgU2V0dGluZyB0aGUgbGlicyBmb2xkZXIgYXMgaWdub3JlZCBhbmQgdGhlbiBjb3B5IHRoZSBjb250ZW50IG9mIHRoZSBydW50aW1lCi0JCUlQYXRoIGxpYlBhdGggPSBuZXcgUGF0aChydW50aW1lTG9jYXRpb24pOwotCQlsaWJQYXRoID0gbGliUGF0aC5hcHBlbmQoQXhpczJDb25zdGFudHMuRElSX1dFQl9JTkYpOwotCQlsaWJQYXRoID0gbGliUGF0aC5hcHBlbmQoQXhpczJDb25zdGFudHMuRElSX0xJQik7Ci0JCUxpc3Q8U3RyaW5nPiBpZ25vcmVMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWlnbm9yZUxpc3QuYWRkKGxpYlBhdGgudG9PU1N0cmluZygpKTsKLQkJY29udGVudENvcHlVdGlscy51cGRhdGVDaGVja0xpc3QoaWdub3JlTGlzdCk7Ci0JCQotCQkvL1JlbGF0ZWQgaXNzdWUgMTg2NDI5LCBTb2x1dGlvbiBpcyB0byBkaXNhYmxlIHRoZSB2YWxpZGF0aW9uIG9mIHRoZSBBeGlzMiBKU1AgY29udGFpbmVyIGxvY2F0aW9uLgotCQlWYWxpZGF0aW9uRnJhbWV3b3JrIHZhbGlkYXRpb25GcmFtZXdvcmtJbnN0YW5jZSA9IFZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpOwotCQlTdHJpbmdbXSBub2RlID0ge0F4aXMyQ29uc3RhbnRzLkRJUl9BWElTMl9XRUJ9OwotCQlJUGF0aCBwYXRoRm9yQXhpczJKU1BDb250YWluZXIgPSBuZXcgUGF0aCgKLQkJCQlGaWxlVXRpbHMuYWRkTm9kZXNUb1BhdGgoSjJFRVV0aWxzLmdldFdlYkNvbnRlbnRQYXRoKHByb2plY3QpLnRvT1NTdHJpbmcoKSwJbm9kZSkpOwotCQl2YWxpZGF0aW9uRnJhbWV3b3JrSW5zdGFuY2UuZGlzYWJsZVZhbGlkYXRpb24oCi0JCQkJcHJvamVjdC5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0Rm9sZGVyKHBhdGhGb3JBeGlzMkpTUENvbnRhaW5lcikpOwotCQkKLQkJc3RhdHVzID0gY29udGVudENvcHlVdGlscy5jb3B5RGlyZWN0b3J5UmVjdXJzaXZlbHlJbnRvV29ya3NwYWNlKAotCQkJCXJ1bnRpbWVMb2NhdGlvbiwgCi0JCQkJRmFjZXRDb250YWluZXJVdGlscy5wYXRoVG9XZWJQcm9qZWN0Q29udGFpbmVyKHByb2plY3QudG9TdHJpbmcoKSksIAotCQkJCW1vbml0b3IsCi0JCQkJZmFsc2UKLQkJKTsKLQkJCi0JCS8vIEFmdGVyIHRoYXQgY29weSB0aGUgbmVzZXNzZXJ5IHNldCBvZiBsaWJyYXJpZXMgdG8gdGhlIHByb2plY3QgYWdhaW4KLQkJTGlzdDxTdHJpbmc+IGluY2x1ZGVMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWNvbnRlbnRDb3B5VXRpbHMudXBkYXRlQ2hlY2tMaXN0KGxvYWRJbmNsdWRlTGlzdFdpdGhBeGlzMkxpYnMobGliUGF0aC50b09TU3RyaW5nKCksCi0JCQkJaW5jbHVkZUxpc3QpKTsKLQkJc3RhdHVzID0gY29udGVudENvcHlVdGlscy5jb3B5RGlyZWN0b3J5UmVjdXJzaXZlbHlJbnRvV29ya3NwYWNlKAotCQkJCWxpYlBhdGgudG9PU1N0cmluZygpLCBGYWNldENvbnRhaW5lclV0aWxzLmdldEF4aXMyV2ViQ29udGFpbmVyTGliUGF0aChwcm9qZWN0KSwgCi0JCQkJbW9uaXRvciwKLQkJCQl0cnVlCi0JCSk7Ci0KLQkJLy9NZXJnZSB3ZWIueG1sIEZpbGVzCi0JCU1lcmdlV0VCWE1MQ29tbWFuZCBtZXJnZVdlYlhNTENvbW1hbmQgPSBuZXcgTWVyZ2VXRUJYTUxDb21tYW5kKCk7Ci0JCW1lcmdlV2ViWE1MQ29tbWFuZC5zZXRFeHRyYUF4aXMyVGFnc0FkZGVkKGZhbHNlKTsKLQkJbWVyZ2VXZWJYTUxDb21tYW5kLnNldFNlcnZlclByb2plY3QocHJvamVjdCk7Ci0JCW1lcmdlV2ViWE1MQ29tbWFuZC5leGV4dXRlT3ZlcnJpZGUobW9uaXRvcik7Ci0KLQkJLy9jbGVhbiB1cCB0ZW1wZXJ5IGZpbGVzCi0JCUZpbGUgdGVtcEZhY2V0RGlyZWN0b3J5ID0gbmV3IEZpbGUocnVudGltZUxvY2F0aW9uKTsKLQkJaWYgKHRlbXBGYWNldERpcmVjdG9yeS5leGlzdHMoKSAmJiBjb250ZXh0LmlzQXhpczJTZXJ2ZXJQYXRoUmVwcmVzZW50c1dhcigpKSB7Ci0JCQlGaWxlVXRpbHMuZGVsZXRlRGlyKHRlbXBGYWNldERpcmVjdG9yeSk7Ci0JCX0KLQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNsZWFudXBJZkZhY2V0U3RhdHVzRmFpbGVkKFN0cmluZyBydW50aW1lTG9jYXRpb24pewotCQlGaWxlIHRlbXBGYWNldERpcmVjdG9yeSA9IG5ldyBGaWxlKHJ1bnRpbWVMb2NhdGlvbik7Ci0JCWlmICh0ZW1wRmFjZXREaXJlY3RvcnkuZXhpc3RzKCkpIHsKLQkJCUZpbGVVdGlscy5kZWxldGVEaXIodGVtcEZhY2V0RGlyZWN0b3J5KTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIElTdGF0dXMgaGFuZGxlRXhjZXB0aW9uU3RhdHVzKEV4Y2VwdGlvbiBlKXsKLQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQlzdGF0dXMgPSBuZXcgU3RhdHVzKDEscHJvamVjdC50b1N0cmluZygpLDEsQXhpczJDb3JlVUlNZXNzYWdlcy5FUlJPUl9TRVJWRVJfSVNfTk9UX1NFVCxlKTsKLQkJY2xlYW51cElmRmFjZXRTdGF0dXNGYWlsZWQoQXhpczJDb3JlVXRpbHMudGVtcEF4aXMyRGlyZWN0b3J5KCkpOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQkKLQkvKioKLQkgKiBMb2FkIHRoZSBleGFjdCBsaWJyYXJpZXMgbGlzdCBmcm9tIHRoZSBheGlzMiBqYXJzIHdpdGggdGhlIGNvcnJlY3QgdmVyc2lvbnMgdG8gdGhlIAotCSAqIDxjb2RlPnBhdGg8L2NvZGU+LiBEb2luZyBpdCB0aGlzIHdheSBpbnRyb2R1Y2UgdGhlIHNjYWxhYmlsaXR5IHRvIHRoZSBzb2x1dGlvbiAKLQkgKiB3aGVyZSB0aGUgbmVlZCBjb21lcyBpbiB0aGUgZnV0dXJlIHJlbGVhc2VzIHRvIGluY2x1ZGUgYWRkaXRpb25hbCBsaWJyYXJpZXMgYW5kIAotCSAqIGlmIG5lZWRlZCBmaWx0ZXIgb3V0IHNvbWUgbGlicmFyaWVzLgotCSAqIEBwYXJhbSBydW50aW1lTG9jYXRpb24KLQkgKiBAcGFyYW0gaW5jbHVkZUxpc3QKLQkgKiBAcmV0dXJuIGxvYWRlZCBsaXN0Ci0JICovCi0JcHJpdmF0ZSBMaXN0IGxvYWRJbmNsdWRlTGlzdFdpdGhBeGlzMkxpYnMoU3RyaW5nIHBhdGgsIExpc3QgaW5jbHVkZUxpc3QpewotCQlmb3IgKGludCBpID0gMDsgaSA8IEF4aXMyQ29uc3RhbnRzLkFYSVMyX0xJQl9QUkVGSVhFUy5sZW5ndGg7IGkrKykgewotCQkJRmlsZVtdIGphckZpbGVMaXN0ID0gRmlsZVV0aWxzLmdldE1hdGNoaW5nRmlsZXMocGF0aCwKLQkJCQkJQXhpczJDb25zdGFudHMuQVhJUzJfTElCX1BSRUZJWEVTW2ldLCAKLQkJCQkJQXhpczJDb25zdGFudHMuSkFSKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgamFyRmlsZUxpc3QubGVuZ3RoOyBqKyspIHsKLQkJCQlpbmNsdWRlTGlzdC5hZGQoamFyRmlsZUxpc3Rbal0uZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJfQotCQkJLy9GaXggZm9yIHRoZSAyMDU5NzIgCi0JCQlGaWxlW10gbGljZW5zZUZpbGVMaXN0ID0gRmlsZVV0aWxzLmdldE1hdGNoaW5nRmlsZXMocGF0aCwKLQkJCQkJQXhpczJDb25zdGFudHMuQVhJUzJfTElCX1BSRUZJWEVTW2ldLCAKLQkJCQkJQXhpczJDb25zdGFudHMuVFhUKTsKLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgbGljZW5zZUZpbGVMaXN0Lmxlbmd0aDsgaysrKSB7Ci0JCQkJaW5jbHVkZUxpc3QuYWRkKGxpY2Vuc2VGaWxlTGlzdFtrXS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluY2x1ZGVMaXN0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9mYWNldC9jb21tYW5kcy9NZXJnZVdFQlhNTENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9mYWNldC9jb21tYW5kcy9NZXJnZVdFQlhNTENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhhM2FkNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvZmFjZXQvY29tbWFuZHMvTWVyZ2VXRUJYTUxDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMCBXU08yIEluYywgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogV1NPMiBJbmMuIC0gbW9kaWZpZWQgYW5kIGZpeCB3ZWIueG1sIHdpcGVkIG91dCB3aGVuIEF4aXMyIGZhY2V0Ci0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwNTE1ICAgMTE1MjI1IHNlbmdwbEBjYS5pYm0uY29tIC0gU2VuZyBQaHVuZy1MdQotICogMjAwNzA2MDYgICAxNzc0MjEgc2FuZGFraXRoQHdzbzIuY29tIC0gZml4IHdlYi54bWwgd2lwZWQgb3V0IHdoZW4gQXhpczIgZmFjZXQKLSAqIDIwMDkxMjA3ICAgMTkyMDA1IHNhbWluZGF3QHdzbzIuY29tIC0gbWVyZ2UgdGhlIHdlYi54bWwgdG8gaGF2ZSBheGlzMiB3ZWxjb21lIGZpbGUgZGVmaW5lZAotICogMjAxMDAzMDgJICAyODI0NjYgc2FtaW5kYXdAd3NvMi5jb20gLSBTYW1pbmRhIFdpamVyYXRuZSwgc3VwcG9ydCBmb3IgYXhpczIgMS41Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmZhY2V0LmNvbW1hbmRzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5Nb2RlbFByb3ZpZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5FcnJvckNvZGVFcnJvclBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YWVlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuVXJsUGF0dGVyblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWxjb21lRmlsZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUuY29uc3RhbnQuQXhpczJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUudXRpbHMuRmFjZXRDb250YWluZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS51dGlscy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmZhY2V0LnV0aWxzLkF4aXMyUnVudGltZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgTWVyZ2VXRUJYTUxDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gewotCi0JcHJpdmF0ZSBJUHJvamVjdCBzZXJ2ZXJQcm9qZWN0OwotCXByaXZhdGUgYm9vbGVhbiBleHRyYUF4aXMyVGFnc0FkZGVkID0gZmFsc2U7Ci0KLSAgcHVibGljIE1lcmdlV0VCWE1MQ29tbWFuZCggKSB7Ci0gIH0KLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhZGFwdGFibGUgKXsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCQotCXB1YmxpYyBJU3RhdHVzIGV4ZXh1dGVPdmVycmlkZSggSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKXsKLQkJSUVudmlyb25tZW50IGVudmlyb25tZW50ID0gZ2V0RW52aXJvbm1lbnQoKTsKLQkJaWYgKHNlcnZlclByb2plY3QgIT0gbnVsbCkgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQkJc3RhdHVzID0gbWVyZ2VXZWJYTUwoZ2V0QXhpc1NlcnZsZXREZXNjcmlwdG9yKCkpOwotCQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikgewotCQkJCWVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkJCXJldHVybiBzdGF0dXM7Ci0JCQl9Ci0JCQlzdGF0dXMgPSBtZXJnZVdlYlhNTChnZXRBZG1pbnRTZXJ2bGV0RGVzY3JpcHRvcigpKTsKLQkJCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpIHsKLQkJCQllbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJfQotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQkKLQlwcml2YXRlIElTdGF0dXMgbWVyZ2VXZWJYTUwoZmluYWwgU2VydmxldERlc2NyaXB0b3Igc2VydmxldERlc2NyaXB0b3IpewotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCWZpbmFsIElNb2RlbFByb3ZpZGVyIHByb3ZpZGVyID0gTW9kZWxQcm92aWRlck1hbmFnZXIuZ2V0TW9kZWxQcm92aWRlcihzZXJ2ZXJQcm9qZWN0KTsKLQkJcHJvdmlkZXIubW9kaWZ5KG5ldyBSdW5uYWJsZSgpewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCU9iamVjdCBvYmplY3QgPSBwcm92aWRlci5nZXRNb2RlbE9iamVjdCgpOwotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHApewotCQkJCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAgamF2YWVlV2ViQXBwID0gCi0JCQkJCQkJCQkob3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwKSBvYmplY3Q7Ci0JCQkJCWFkZEphdmFlZVNlcnZsZXQoc2VydmVyUHJvamVjdCwgc2VydmxldERlc2NyaXB0b3IsIGphdmFlZVdlYkFwcCk7Ci0JCQkJfQotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHApewotCQkJCQlXZWJBcHAgd2ViQXBwID0gKFdlYkFwcCkgb2JqZWN0OwotCQkJCQlhZGRTZXJ2bGV0KHNlcnZlclByb2plY3QsIHNlcnZsZXREZXNjcmlwdG9yLCB3ZWJBcHApOwotCQkJCX0KLQkJCX0KLQkJCQotCQl9LCBudWxsKTsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0JCi0JcHJpdmF0ZSBTZXJ2bGV0RGVzY3JpcHRvciBnZXRBeGlzU2VydmxldERlc2NyaXB0b3IoKSB7Ci0KLQkJU2VydmxldERlc2NyaXB0b3Igc2QgPSBuZXcgU2VydmxldERlc2NyaXB0b3IoKTsKLQkJc2QuX25hbWUgPSAiQXhpc1NlcnZsZXQiOyAvLyROT04tTkxTLTEkCi0JCXNkLl9kaXNwbGF5TmFtZSA9ICJBcGFjaGUtQXhpcyBTZXJ2bGV0IjsgLy8kTk9OLU5MUy0xJAotCQlzZC5fY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQXhpc1NlcnZsZXQiOyAvLyROT04tTkxTLTEkCi0JCXNkLl9tYXBwaW5ncyA9IG5ldyBTdHJpbmdbXSB7ICIvc2VydmxldC9BeGlzU2VydmxldCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkiKi5qd3MiLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJIi9zZXJ2aWNlcy8qIiB9OyAvLyROT04tTkxTLTEkCi0JCS8vc2QuX2xvYWRPblN0YXJ0dXAgPSBuZXcgSW50ZWdlcigxKTsKLQkJcmV0dXJuIHNkOwotCX0KLQotCXByaXZhdGUgU2VydmxldERlc2NyaXB0b3IgZ2V0QWRtaW50U2VydmxldERlc2NyaXB0b3IoKSB7Ci0JCVNlcnZsZXREZXNjcmlwdG9yIHNkID0gbmV3IFNlcnZsZXREZXNjcmlwdG9yKCk7Ci0JCXNkLl9uYW1lID0gIkF4aXNBZG1pblNlcnZsZXQiOyAvLyROT04tTkxTLTEkCi0JCXNkLl9kaXNwbGF5TmFtZSA9ICJBcGFjaGUtQXhpcyBBZG1pbiBTZXJ2bGV0IFdlYiBBZG1pbiI7IC8vJE5PTi1OTFMtMSQKLQkJc2QuX2NsYXNzTmFtZSA9IEF4aXMyUnVudGltZVV0aWxzLmdldEF4aXMyU2VydmxldEFkbWluQ2xhc3Moc2VydmVyUHJvamVjdCk7IAotCQlzZC5fbWFwcGluZ3MgPSBuZXcgU3RyaW5nW10geyAiL2F4aXMyLWFkbWluLyoiCX07IC8vJE5PTi1OTFMtMSQKLQkJc2QuX2xvYWRPblN0YXJ0dXAgPSBuZXcgSW50ZWdlcigxMDApOwotCQlyZXR1cm4gc2Q7Ci0JfQotCi0KLQlwdWJsaWMgSVN0YXR1cyBhZGRTZXJ2bGV0KElQcm9qZWN0IHdlYlByb2plY3QsIFNlcnZsZXREZXNjcmlwdG9yIHNlcnZsZXREZXNjcmlwdG9yLAotCQkJCQkJCQkJCQkJCQkJCQkJCVdlYkFwcCB3ZWJhcHApIHsKLQkJdHJ5IHsKLQkJCSAgIExpc3QgdGhlU2VydmxldHMgPSB3ZWJhcHAuZ2V0U2VydmxldHMoKTsKLQkJCSAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhlU2VydmxldHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlTZXJ2bGV0IGFTZXJ2bGV0ID0gKFNlcnZsZXQpIHRoZVNlcnZsZXRzLmdldChpKTsKLQkJCQlpZiAoYVNlcnZsZXQuZ2V0U2VydmxldE5hbWUoKS5lcXVhbHMoc2VydmxldERlc2NyaXB0b3IuX25hbWUpKSB7Ci0JCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCSB9Ci0JCQkgICB9Ci0JCQkgICAKLQkJCSAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBmYWN0b3J5ID0gV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRTsKLQotCQkJICAgU2VydmxldCBzZXJ2bGV0ID0gZmFjdG9yeS5jcmVhdGVTZXJ2bGV0KCk7Ci0JCQkgICBTZXJ2bGV0VHlwZSBzZXJ2bGV0VHlwZSA9IGZhY3RvcnkuY3JlYXRlU2VydmxldFR5cGUoKTsKLQkJCSAgIHNlcnZsZXQuc2V0V2ViVHlwZShzZXJ2bGV0VHlwZSk7Ci0JCQkgICBzZXJ2bGV0LnNldFNlcnZsZXROYW1lKHNlcnZsZXREZXNjcmlwdG9yLl9uYW1lKTsKLQkJCSAgIHNlcnZsZXRUeXBlLnNldENsYXNzTmFtZShzZXJ2bGV0RGVzY3JpcHRvci5fY2xhc3NOYW1lKTsKLQkJCSAgIGlmKHNlcnZsZXREZXNjcmlwdG9yLl9kaXNwbGF5TmFtZSAhPSBudWxsKXsKLQkJCSAgICAgc2VydmxldC5zZXREaXNwbGF5TmFtZShzZXJ2bGV0RGVzY3JpcHRvci5fZGlzcGxheU5hbWUpOwotCQkJICAgfQotCQkJICAgaWYoc2VydmxldERlc2NyaXB0b3IuX2xvYWRPblN0YXJ0dXAgIT0gbnVsbCl7Ci0JCQkJICBzZXJ2bGV0LnNldExvYWRPblN0YXJ0dXAoc2VydmxldERlc2NyaXB0b3IuX2xvYWRPblN0YXJ0dXApOwotCQkJICAgfQotCQkJICAgaWYoc2VydmxldERlc2NyaXB0b3IuX3BhcmFtcyAhPSBudWxsKXsKLQkJCQkgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IHNlcnZsZXQuZ2V0UGFyYW1zQXNQcm9wZXJ0aWVzKCk7Ci0JCQkJICBwcm9wZXJ0aWVzLnB1dEFsbChzZXJ2bGV0RGVzY3JpcHRvci5fcGFyYW1zKTsKLQkJCSAgIH0KLQkJCSAgIHdlYmFwcC5nZXRTZXJ2bGV0cygpLmFkZChzZXJ2bGV0KTsKLQkJCQotCQkJICAgaWYoc2VydmxldERlc2NyaXB0b3IuX21hcHBpbmdzICE9IG51bGwpewotCQkJCSAgZm9yKGludCBpPTA7IGk8c2VydmxldERlc2NyaXB0b3IuX21hcHBpbmdzLmxlbmd0aDsgaSsrKXsKLQkJCQkJU2VydmxldE1hcHBpbmcgc2VydmxldE1hcHBpbmcgPSBmYWN0b3J5LmNyZWF0ZVNlcnZsZXRNYXBwaW5nKCk7Ci0JCQkJCXNlcnZsZXRNYXBwaW5nLnNldFNlcnZsZXQoc2VydmxldCk7Ci0JCQkJCXNlcnZsZXRNYXBwaW5nLnNldFVybFBhdHRlcm4oc2VydmxldERlc2NyaXB0b3IuX21hcHBpbmdzW2ldKTsKLQkJCQkJd2ViYXBwLmdldFNlcnZsZXRNYXBwaW5ncygpLmFkZChzZXJ2bGV0TWFwcGluZyk7CQkJCQkKLQkJCQkgIH0KLQkJCSAgIH0KLQkJCSAgIAotCQkJICAgaWYgKCFleHRyYUF4aXMyVGFnc0FkZGVkKSB7Ci0JCQkJICAgIC8vYWRkIHRoZSB3ZWxjb21lIGZpbGUgbGlzdAotCQkJCSAgICB3ZWJhcHAuZ2V0RmlsZUxpc3QoKS5hZGRGaWxlTmFtZWQoIi9heGlzMi13ZWIvaW5kZXguanNwIik7Ci0JCQkJICAgIAotCQkJCSAgICAvL2FkZCB0aGUgZXJyb3IgcGFnZXMKLQkJCQkgICAgRXJyb3JDb2RlRXJyb3JQYWdlIGVycm9yUGFnZTQwNCA9IGZhY3RvcnkuY3JlYXRlRXJyb3JDb2RlRXJyb3JQYWdlKCk7Ci0JCQkJICAgIGVycm9yUGFnZTQwNC5zZXRFcnJvckNvZGUoIjQwNCIpOwotCQkJCSAgICBlcnJvclBhZ2U0MDQuc2V0TG9jYXRpb24oIi9heGlzMi13ZWIvRXJyb3IvZXJyb3I0MDQuanNwIik7Ci0JCQkJICAgIHdlYmFwcC5nZXRFcnJvclBhZ2VzKCkuYWRkKGVycm9yUGFnZTQwNCk7Ci0JCQkJICAgIAotCQkJCSAgICBFcnJvckNvZGVFcnJvclBhZ2UgZXJyb3JQYWdlNTAwID0gZmFjdG9yeS5jcmVhdGVFcnJvckNvZGVFcnJvclBhZ2UoKTsKLQkJCQkgICAgZXJyb3JQYWdlNTAwLnNldEVycm9yQ29kZSgiNTAwIik7Ci0JCQkJICAgIGVycm9yUGFnZTUwMC5zZXRMb2NhdGlvbigiL2F4aXMyLXdlYi9FcnJvci9lcnJvcjUwMC5qc3AiKTsKLQkJCQkgICAgd2ViYXBwLmdldEVycm9yUGFnZXMoKS5hZGQoZXJyb3JQYWdlNTAwKTsKLQkJCQkgICAgZXh0cmFBeGlzMlRhZ3NBZGRlZCA9IHRydWU7Ci0JCQkgICB9Ci0JCQkgICAKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCi0JCQlyZXR1cm4gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoCi0JCQkJCSJNU0dfRVJST1JfVVBEQVRFX1dFQl9YTUwiLAotCQkJCQllKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkSmF2YWVlU2VydmxldChJUHJvamVjdCB3ZWJQcm9qZWN0LCBTZXJ2bGV0RGVzY3JpcHRvciBzZXJ2bGV0RGVzY3JpcHRvciwKLQkJCW9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCB3ZWJhcHApIHsKLQkJTGlzdCB0aGVTZXJ2bGV0cyA9IHdlYmFwcC5nZXRTZXJ2bGV0cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRoZVNlcnZsZXRzLnNpemUoKTsgaSsrKSB7Ci0JCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0IGFTZXJ2bGV0ID0gCi0JCQkJCQkJCShvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0KSB0aGVTZXJ2bGV0cy5nZXQoaSk7Ci0JCQlpZiAoYVNlcnZsZXQuZ2V0U2VydmxldE5hbWUoKS5lcXVhbHMoc2VydmxldERlc2NyaXB0b3IuX25hbWUpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCVdlYkZhY3RvcnkgZmFjdG9yeSA9IFdlYkZhY3RvcnkuZUlOU1RBTkNFOwotCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0IHNlcnZsZXQgPSBmYWN0b3J5LmNyZWF0ZVNlcnZsZXQoKTsKLQkJc2VydmxldC5zZXRTZXJ2bGV0TmFtZShzZXJ2bGV0RGVzY3JpcHRvci5fbmFtZSk7Ci0JCXNlcnZsZXQuc2V0U2VydmxldENsYXNzKHNlcnZsZXREZXNjcmlwdG9yLl9jbGFzc05hbWUpOwotCQlpZihzZXJ2bGV0RGVzY3JpcHRvci5fZGlzcGxheU5hbWUgIT0gbnVsbCl7Ci0JCQlEaXNwbGF5TmFtZSBkaXNwbGF5TmFtZU9iaiA9IEphdmFlZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc3BsYXlOYW1lKCk7Ci0JCQlkaXNwbGF5TmFtZU9iai5zZXRWYWx1ZShzZXJ2bGV0RGVzY3JpcHRvci5fZGlzcGxheU5hbWUpOwotCQkJc2VydmxldC5nZXREaXNwbGF5TmFtZXMoKS5hZGQoZGlzcGxheU5hbWVPYmopOyAgCi0JCX0KLQkJaWYoc2VydmxldERlc2NyaXB0b3IuX2xvYWRPblN0YXJ0dXAgIT0gbnVsbCl7Ci0JCQlzZXJ2bGV0LnNldExvYWRPblN0YXJ0dXAoc2VydmxldERlc2NyaXB0b3IuX2xvYWRPblN0YXJ0dXApOwotCQl9Ci0JCXdlYmFwcC5nZXRTZXJ2bGV0cygpLmFkZChzZXJ2bGV0KTsKLQkJaWYoc2VydmxldERlc2NyaXB0b3IuX21hcHBpbmdzICE9IG51bGwpewotCQkJZm9yKGludCBpPTA7IGk8c2VydmxldERlc2NyaXB0b3IuX21hcHBpbmdzLmxlbmd0aDsgaSsrKXsKLQkJCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0TWFwcGluZyBzZXJ2bGV0TWFwcGluZyA9IAotCQkJCQkJCQkJCQkJCWZhY3RvcnkuY3JlYXRlU2VydmxldE1hcHBpbmcoKTsJCQkKLQkJCQlzZXJ2bGV0TWFwcGluZy5zZXRTZXJ2bGV0TmFtZShzZXJ2bGV0LmdldFNlcnZsZXROYW1lKCkpOwotCQkJCVVybFBhdHRlcm5UeXBlIHVybCA9IEphdmFlZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVVybFBhdHRlcm5UeXBlKCk7Ci0JCQkJdXJsLnNldFZhbHVlKHNlcnZsZXREZXNjcmlwdG9yLl9tYXBwaW5nc1tpXSk7Ci0JCQkJc2VydmxldE1hcHBpbmcuZ2V0VXJsUGF0dGVybnMoKS5hZGQodXJsKTsKLQkJCQl3ZWJhcHAuZ2V0U2VydmxldE1hcHBpbmdzKCkuYWRkKHNlcnZsZXRNYXBwaW5nKTsJCQkJCQotCQkJfQotCQl9Ci0JCUxpc3Qgd2VsY29tZUZpbGVMaXN0cyA9IHdlYmFwcC5nZXRXZWxjb21lRmlsZUxpc3RzKCk7Ci0JCWlmICh3ZWxjb21lRmlsZUxpc3RzIT1udWxsKXsKLQkJCWZvciAoT2JqZWN0IGxpc3QgOiB3ZWxjb21lRmlsZUxpc3RzKSB7Ci0JCQkJaWYgKGxpc3QgaW5zdGFuY2VvZiBXZWxjb21lRmlsZUxpc3QpewotCQkJCQlXZWxjb21lRmlsZUxpc3Qgd2VsY29tZUxpc3Q9KFdlbGNvbWVGaWxlTGlzdCkgbGlzdDsKLQkJCQkJaWYgKCF3ZWxjb21lTGlzdC5nZXRXZWxjb21lRmlsZXMoKS5jb250YWlucyhBeGlzMkNvbnN0YW50cy5BWElTMl9XRUxDT01FX0ZJTEUpKQotCQkJCQkJd2VsY29tZUxpc3QuZ2V0V2VsY29tZUZpbGVzKCkuYWRkKEF4aXMyQ29uc3RhbnRzLkFYSVMyX1dFTENPTUVfRklMRSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotICAKLQotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJQcm9qZWN0KElQcm9qZWN0IHNlcnZlclByb2plY3QpIHsKLSAgICB0aGlzLnNlcnZlclByb2plY3QgPSBzZXJ2ZXJQcm9qZWN0OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRFeHRyYUF4aXMyVGFnc0FkZGVkKGJvb2xlYW4gZmxhZykgewotCSAgICB0aGlzLmV4dHJhQXhpczJUYWdzQWRkZWQgPSBmbGFnOwotICB9Ci0KLQlwdWJsaWMgY2xhc3MgU2VydmxldERlc2NyaXB0b3IgewotCQlTdHJpbmcgX25hbWU7Ci0JCVN0cmluZyBfY2xhc3NOYW1lOwotCQlTdHJpbmcgX2Rpc3BsYXlOYW1lOwotCQlNYXAgX3BhcmFtczsKLQkJU3RyaW5nW10gX21hcHBpbmdzOwotCQlJbnRlZ2VyIF9sb2FkT25TdGFydHVwOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2ZhY2V0L2RlbGlnYXRlL0F4aXMyQ29yZUZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvZmFjZXQvZGVsaWdhdGUvQXhpczJDb3JlRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJkNjhlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvZmFjZXQvZGVsaWdhdGUvQXhpczJDb3JlRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDIxMyAgMTY4NzY2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIAotICogCQkJCQkJCQkJCSAgZmFjZXQgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzY2Ci0gKiAyMDA3MDUwMSAgIDE4MDI4NCBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKiAyMDA3MDYwNiAgIDE3NzQyMSBzYW5kYWtpdGhAd3NvMi5jb20gLSBmaXggd2ViLnhtbCB3aXBlZCBvdXQgd2hlbiBBeGlzMiBmYWNldAotICogMjAwNzA4MjQgICAyMDA1MTUgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgTk9OLU5MUyBtb3ZlIHRvIHNlcGVyYXRlIGZpbGUKLSAqIDIwMDcxMDEwICAgMjA0MTgyIGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuLCBjaGVjayBmb3IgWGFsYW4gVHJhbnNmb3JtZXJGYWN0b3J5SW1wbAotICogMjAwODAyMTMgICAyMTg5MTAga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuZmFjZXQuZGVsaWdhdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLmNvbnN0YW50LkF4aXMyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLnBsdWdpbi5tZXNzYWdlcy5BeGlzMkNvcmVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLnV0aWxzLlJ1bnRpbWVQcm9wZXJ0eVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5mYWNldC5jb21tYW5kcy5BeGlzMldlYnNlcnZpY2VzU2VydmVyQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBBeGlzMkNvcmVGYWNldEluc3RhbGxEZWxlZ2F0ZSBpbXBsZW1lbnRzIElEZWxlZ2F0ZSB7Ci0KLQlwcml2YXRlIElTdGF0dXMgc3RhdHVzOwotCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvamVjdCBwcm9qZWN0LCBJUHJvamVjdEZhY2V0VmVyc2lvbiBhcmcxLCBPYmplY3QgYXJnMiwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQltb25pdG9yLmJlZ2luVGFzayhBeGlzMkNvcmVVSU1lc3NhZ2VzLlBST0dSRVNTX0lOU1RBTExfQVhJUzJfUlVOVElNRSwgMiApOwotCi0JCUF4aXMyV2Vic2VydmljZXNTZXJ2ZXJDb21tYW5kIGNvbW1hbmQgPSBuZXcgQXhpczJXZWJzZXJ2aWNlc1NlcnZlckNvbW1hbmQocHJvamVjdCk7IAotCQlzdGF0dXMgPSBjb21tYW5kLmV4ZWN1dGVPdmVycmlkZShtb25pdG9yKTsKLQkJaWYgKHN0YXR1cy5nZXRDb2RlKCkgPT0gU3RhdHVzLk9LX1NUQVRVUy5nZXRDb2RlKCkgKXsKLQkJCVJ1bnRpbWVQcm9wZXJ0eVV0aWxzLndyaXRlU2VydmVyU3RhdXNUb1Byb3BlcnRpZXNGaWxlKAotCQkJCQlBeGlzMkNvbnN0YW50cy5TRVJWRVJfU1RBVFVTX1BBU1MpOwotCQl9ZWxzZXsKLQkJCVJ1bnRpbWVQcm9wZXJ0eVV0aWxzLndyaXRlU2VydmVyU3RhdXNUb1Byb3BlcnRpZXNGaWxlKAotCQkJCQlBeGlzMkNvbnN0YW50cy5TRVJWRVJfU1RBVFVTX0ZBSUwpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQkJfQotCQltb25pdG9yLndvcmtlZCggMSApOwotCQltb25pdG9yLmRvbmUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9mYWNldC9kZWxpZ2F0ZS9BeGlzMkNvcmVGYWNldFVuSW5zdGFsbERlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvZmFjZXQvZGVsaWdhdGUvQXhpczJDb3JlRmFjZXRVbkluc3RhbGxEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjEwNGM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9mYWNldC9kZWxpZ2F0ZS9BeGlzMkNvcmVGYWNldFVuSW5zdGFsbERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAyMTMgIDE2ODc2NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiAKLSAqIDIwMDcwNjExICAxOTIwMDIga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqIAkJCQkJCQkJCQkgIGZhY2V0IHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2NgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5mYWNldC5kZWxpZ2F0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUucGx1Z2luLm1lc3NhZ2VzLkF4aXMyQ29yZVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgQXhpczJDb3JlRmFjZXRVbkluc3RhbGxEZWxlZ2F0ZSBpbXBsZW1lbnRzIElEZWxlZ2F0ZSB7Ci0JCi0JcHJpdmF0ZSBJU3RhdHVzIHN0YXR1czsKLQkKLQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9qZWN0IHByb2plY3QsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGFyZzEsIE9iamVjdCBhcmcyLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCW1vbml0b3IuYmVnaW5UYXNrKEF4aXMyQ29yZVVJTWVzc2FnZXMuUFJPR1JFU1NfVU5JTlNUQUxMX0FYSVMyX1JVTlRJTUUsIDIgKTsKLQkJCS8vIFRPRE8gcm9sbGJhY2sgdGhlIGR5bmFtaWMgd2ViIHByb2plY3QgdG8gdGhlIHByZXZpb3VzIHN0YXRlLgotCSAgICAgICAgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCW1vbml0b3Iud29ya2VkKCAxICk7Ci0JfQotCQotCXB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpewotCQlyZXR1cm4gc3RhdHVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9mYWNldC9kZWxpZ2F0ZS9BeGlzMkV4dEZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvZmFjZXQvZGVsaWdhdGUvQXhpczJFeHRGYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDdmNWNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9mYWNldC9kZWxpZ2F0ZS9BeGlzMkV4dEZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAyMTMgIDE2ODc2NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiAKLSAqIAkJCQkJCQkJCQkgIGZhY2V0IHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2NgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5mYWNldC5kZWxpZ2F0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotcHVibGljIGNsYXNzIEF4aXMyRXh0RmFjZXRJbnN0YWxsRGVsZWdhdGUgaW1wbGVtZW50cyBJRGVsZWdhdGUgewotCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvamVjdCBhcmcwLCBJUHJvamVjdEZhY2V0VmVyc2lvbiBhcmcxLCBPYmplY3QgYXJnMiwKLQkJCUlQcm9ncmVzc01vbml0b3IgYXJnMykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJLy9UT0RPIFRoaXMgd2lsbCBpbmNsdWRlIHRoZSBtb3JlIHJlcXVpcmVtZW50cyB0aGF0IG5lZWRlZCB0byBiZSBhdXRvbWF0ZWQKLQkJCS8vCSAgIHdoZW4gd2UgY292ZXIgdGhlIG90aGVyIFJGRSBzIGluIGZ1dHVyZS4KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvZmFjZXQvZGVsaWdhdGUvQXhpczJFeHRGYWNldFVuSW5zdGFsbERlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvZmFjZXQvZGVsaWdhdGUvQXhpczJFeHRGYWNldFVuSW5zdGFsbERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkYzcxY2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2ZhY2V0L2RlbGlnYXRlL0F4aXMyRXh0RmFjZXRVbkluc3RhbGxEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMjEzICAxNjg3NjYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgQXhpczIgCi0gKiAJCQkJCQkJCQkJICBmYWNldCB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjYKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuZmFjZXQuZGVsaWdhdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBBeGlzMkV4dEZhY2V0VW5JbnN0YWxsRGVsZWdhdGUgaW1wbGVtZW50cyBJRGVsZWdhdGUgewotCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvamVjdCBhcmcwLCBJUHJvamVjdEZhY2V0VmVyc2lvbiBhcmcxLCBPYmplY3QgYXJnMiwKLQkJCUlQcm9ncmVzc01vbml0b3IgYXJnMykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJLy9UT0RPIFRoaXMgd2lsbCBpbmNsdWRlIHRoZSBtb3JlIHJlcXVpcmVtZW50cyB0aGF0IG5lZWRlZCB0byBiZSBhdXRvbWF0ZWQKLQkJCS8vCSAgIHdoZW4gd2UgY292ZXIgdGhlIG90aGVyIFJGRSBzIGluIGZ1dHVyZS4KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvZmFjZXQvbWVzc2FnZXMvQXhpczJGYWNldFVJLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvZmFjZXQvbWVzc2FnZXMvQXhpczJGYWNldFVJLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZDE4MzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2ZhY2V0L21lc3NhZ2VzL0F4aXMyRmFjZXRVSS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0jIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIDIwMDcwMjE0ICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgCi0jIAkJCQkJCQkJCQkgIHRoZSBBeGlzMiBmYWNldCB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSMgMjAwNzA1MTcgICAxODczMDcgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgRml4IDE4NzMwNyBQcm9wZXJ0eSBGaWxlIEZpeAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9mYWNldC9tZXNzYWdlcy9BeGlzMkZhY2V0VUlNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2ZhY2V0L21lc3NhZ2VzL0F4aXMyRmFjZXRVSU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZTBhMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2ZhY2V0L21lc3NhZ2VzL0F4aXMyRmFjZXRVSU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAyMTMgIDE2ODc2NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiAKLSAqIAkJCQkJCQkJCQkgIGZhY2V0IHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2NgotICogMjAwNzA0MjYgICAxODMwNDYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aAotICogMjAwNzA1MTcgICAxODczMDcgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgRml4IDE4NzMwNyBQcm9wZXJ0eSBGaWxlIEZpeAotICogMjAwNzA2MDYgICAxNzc0MjEgc2FuZGFraXRoQHdzbzIuY29tIC0gZml4IHdlYi54bWwgd2lwZWQgb3V0IHdoZW4gQXhpczIgZmFjZXQKLSAqIDIwMDcwNzMwICAgMTk0Nzg2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIGFkZGluZyBzZXJ2bGV0YXBpIGphciBmaWx0ZXIKLSAqIDIwMDcwODA4ICAgMTk0OTA2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEZpeGluZyAxOTQ5MDYgUnVudGltZSBsaWIgaXNzdWUKLSAqIDIwMDcwODI0ICAgMjAwNTE1IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIE5PTi1OTFMgbW92ZSB0byBzZXBlcmF0ZSBmaWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmZhY2V0Lm1lc3NhZ2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIEF4aXMyRmFjZXRVSU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9IAotCQkJCSJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuZmFjZXQubWVzc2FnZXMuQXhpczJGYWNldFVJIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEF4aXMyRmFjZXRVSU1lc3NhZ2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBBeGlzMkZhY2V0VUlNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2ZhY2V0L21vZGVsL0ZhY2V0TW9kZWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9mYWNldC9tb2RlbC9GYWNldE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMGQ2OGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2ZhY2V0L21vZGVsL0ZhY2V0TW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDIyMiAgMTY4NzY2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIAotICogCQkJCQkJCQkJCSAgZmFjZXQgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzY2Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmZhY2V0Lm1vZGVsOwotCi1wdWJsaWMgY2xhc3MgRmFjZXRNb2RlbCB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHdlYkZhY2V0Q29uaW5lckRpcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFdlYkZhY2V0Q29uaW5lckRpcigpIHsKLQkJcmV0dXJuIHdlYkZhY2V0Q29uaW5lckRpcjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0V2ViRmFjZXRDb25pbmVyRGlyKFN0cmluZyBpbnB1dFdlYkZhY2V0Q29uaW5lckRpcikgewotCQl3ZWJGYWNldENvbmluZXJEaXIgPSBpbnB1dFdlYkZhY2V0Q29uaW5lckRpcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9mYWNldC9wbHVnaW4vQXhpczJGYWNldFBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2ZhY2V0L3BsdWdpbi9BeGlzMkZhY2V0UGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NWUxMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2ZhY2V0L3BsdWdpbi9BeGlzMkZhY2V0UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAyMTMgIDE2ODc2NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiAKLSAqIAkJCQkJCQkJCQkgIGZhY2V0IHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2NgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5mYWNldC5wbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgQXhpczJGYWNldFBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmFwYWNoZS5heGlzMi5mYWNldCI7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgQXhpczJGYWNldFBsdWdpbiBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEF4aXMyRmFjZXRQbHVnaW4oKSB7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQXhpczJGYWNldFBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEF4aXMyRmFjZXRQbHVnaW4gZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coIGZpbmFsIEV4Y2VwdGlvbiBlICl7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBtc2cgPSBlLmdldE1lc3NhZ2UoKSArICIiOwotICAgICAgICBsb2coIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbXNnLCBlICkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKCBmaW5hbCBJU3RhdHVzIHN0YXR1cyApewotICAgICAgICBnZXRJbnN0YW5jZSgpLmdldExvZygpLmxvZyggc3RhdHVzICk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyggZmluYWwgU3RyaW5nIG1zZyApewotICAgICAgICBsb2coIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbXNnLCBudWxsICkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIElTdGF0dXMgY3JlYXRlRXJyb3JTdGF0dXMoIGZpbmFsIFN0cmluZyBtc2cgKXsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUVycm9yU3RhdHVzKCBtc2csIG51bGwgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIElTdGF0dXMgY3JlYXRlRXJyb3JTdGF0dXMoIGZpbmFsIFN0cmluZyBtc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBFeGNlcHRpb24gZSApewotICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCAwLCBtc2csIGUgKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9mYWNldC91dGlscy9BeGlzMlJ1bnRpbWVVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2ZhY2V0L3V0aWxzL0F4aXMyUnVudGltZVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkODc3M2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2ZhY2V0L3V0aWxzL0F4aXMyUnVudGltZVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMjEzICAxNjg3NjYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgQXhpczIgCi0gKiAJCQkJCQkJCQkJICBmYWNldCB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjYKLSAqIDIwMDcwNDI2ICAgMTgzMDQ2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSAqIDIwMDcwNTAxICAgMTgwMjg0IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSAqIDIwMDcwNTE2ICAgMTgzMTQ3IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGggRml4IGZvciB0aGUgcGVyc2lzdGluZyBEQkNTIHBhdGhzCi0gKiAyMDA3MDUyMyAgIDE3NDg3NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBQZXJzaXN0IFByZWZlcmVuY2VzIGluc2lkZSBGcmFtZXdvcmsKLSAqIDIwMDcwODI0ICAgMjAwNTE1IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIE5PTi1OTFMgbW92ZSB0byBzZXBlcmF0ZSBmaWxlCi0gKiAyMDEwMDMwOAkgIDI4MjQ2NiBzYW1pbmRhd0B3c28yLmNvbSAtIFNhbWluZGEgV2lqZXJhdG5lLCBzdXBwb3J0IGZvciBheGlzMiAxLjUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuZmFjZXQudXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkFudENsYXNzTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLmNvbnN0YW50LkF4aXMyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLmNvbnRleHQuQXhpczJFbWl0dGVyQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5wbHVnaW4uV2ViU2VydmljZUF4aXMyQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS51dGlscy5BeGlzMkNvcmVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS51dGlscy5GYWNldENvbnRhaW5lclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLnV0aWxzLkZpbGVVdGlsczsKLQotcHVibGljIGNsYXNzIEF4aXMyUnVudGltZVV0aWxzIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBaSVA9MCwgVU5aSVAgPSAxOwotCXByb3RlY3RlZCBzdGF0aWMgaW50IG1vZGUgPSBVTlpJUDsKLQlzdGF0aWMgWmlwRmlsZSB6aXBGaWxlOwotCXByb3RlY3RlZCBzdGF0aWMgYnl0ZVtdIGI7Ci0Jc3RhdGljIFNvcnRlZFNldCBjcmVhdGVkRGlyczsKLQlzdGF0aWMgU3RyaW5nIG91dHB1dFBhdGg7Ci0Jc3RhdGljIEF4aXMyRW1pdHRlckNvbnRleHQgY29udGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nICBjb3B5QXhpczJXYXIoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBTdHJpbmcgQXhpczJIb21lKQotCQkJCQkJCXRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uewotCQljb250ZXh0ID0gV2ViU2VydmljZUF4aXMyQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QXhpc0VtaXR0ZXJDb250ZXh0KCk7Ci0JCVN0cmluZyB0ZW1wV2FyRmlsZSA9IG51bGw7Ci0JCVN0cmluZyB0ZW1wV2FyTG9jYXRpb24gPSBudWxsOwotCQlTdHJpbmcgIHRlbXBVbnppcExvY2F0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChuZXcgRmlsZSAoQXhpczJDb3JlVXRpbHMudGVtcEF4aXMyRGlyZWN0b3J5KCkpLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQl0ZW1wV2FyTG9jYXRpb24gPSBBeGlzMkNvcmVVdGlscy5hZGRBbm90aGVyTm9kZVRvUGF0aCgKLQkJCQkJCQkJCQkJCQkJCUF4aXMyQ29yZVV0aWxzLnRlbXBBeGlzMkRpcmVjdG9yeSgpLAotCQkJCQkJCQkJCQkJCQkJQXhpczJDb25zdGFudHMuRElSX1RFTVBXQVIpOwotCQkJRmlsZSB0ZW1wV2FyTG9jYXRpb25GaWxlPSBuZXcgRmlsZSh0ZW1wV2FyTG9jYXRpb24pOwotCQkJaWYgKHRlbXBXYXJMb2NhdGlvbkZpbGUuZXhpc3RzKCkpIHsKLQkJCQlGaWxlVXRpbHMuZGVsZXRlRGlyZWN0b3JpZXModGVtcFdhckxvY2F0aW9uRmlsZSk7Ci0JCQl9Ci0JCQl0ZW1wV2FyTG9jYXRpb25GaWxlLm1rZGlycygpOwotCQkJdGVtcFdhckZpbGUgPSBBeGlzMkNvcmVVdGlscy5hZGRBbm90aGVyTm9kZVRvUGF0aCgKLQkJCQkJCQkJCQkJCQkJCXRlbXBXYXJMb2NhdGlvbiwJCi0JCQkJCQkJCQkJCQkJCQlBeGlzMkNvbnN0YW50cy5GSUxFX0FYSVMyX1dBUik7Ci0JCQluZXcgRmlsZSh0ZW1wV2FyRmlsZSkuY3JlYXRlTmV3RmlsZSgpOwotCQkJU3RyaW5nIGF4aXMyUnVudGltckxvY2F0aW9uID0gbnVsbDsKLQkJCWlmKGNvbnRleHQuZ2V0QXhpczJSdW50aW1lTG9jYXRpb24oKSE9bnVsbCl7Ci0JCQkJYXhpczJSdW50aW1yTG9jYXRpb24gPSBjb250ZXh0LmdldEF4aXMyUnVudGltZUxvY2F0aW9uKCk7Ci0JCQl9ZWxzZXsKLQkJCSAgICBBeGlzMkVtaXR0ZXJDb250ZXh0IGNvbnRleHQgPSBXZWJTZXJ2aWNlQXhpczJDb3JlUGx1Z2luCi0JCQkJCQkJCQkJCQkuZ2V0RGVmYXVsdCgpLmdldEF4aXNFbWl0dGVyQ29udGV4dCgpOwotCQkJICAgIGF4aXMyUnVudGltckxvY2F0aW9uID0gIGNvbnRleHQuZ2V0QXhpczJSdW50aW1lTG9jYXRpb24oKTsKLQotCQkJfQotCQkJCQlTdHJpbmcgYXhpczJXYXJGaWxlID0gQXhpczJDb3JlVXRpbHMuYWRkQW5vdGhlck5vZGVUb1BhdGgoCi0JCQkJCQkJCQkJYXhpczJSdW50aW1yTG9jYXRpb24sCi0JCQkJCQkJCQkJQXhpczJDb25zdGFudHMuRklMRV9BWElTMl9XQVIpOwotCQkJCQlGaWxlQ2hhbm5lbCBzcmNDaGFubmVsID0gbmV3IEZpbGVJbnB1dFN0cmVhbShheGlzMldhckZpbGUpLmdldENoYW5uZWwoKTsKLQkJCQkJRmlsZUNoYW5uZWwgZHN0Q2hhbm5lbCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlbXBXYXJGaWxlKS5nZXRDaGFubmVsKCk7Ci0JCQkJCS8vIENvcHkgZmlsZSBjb250ZW50cyBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbgotCQkJCQlkc3RDaGFubmVsLnRyYW5zZmVyRnJvbShzcmNDaGFubmVsLCAwLCBzcmNDaGFubmVsLnNpemUoKSk7Ci0JCQkJCS8vIENsb3NlIHRoZSBjaGFubmVscwotCQkJCQlzcmNDaGFubmVsLmNsb3NlKCk7Ci0JCQkJCWRzdENoYW5uZWwuY2xvc2UoKTsKLQkJCQkKLQkJCQkvL3VuemlwIHRoaXMgaW50byBhbm90aGVyIGZvdWxkZXIKLQkJCQl0ZW1wVW56aXBMb2NhdGlvbiA9IEZpbGVVdGlscy5hZGRBbm90aGVyTm9kZVRvUGF0aCh0ZW1wV2FyTG9jYXRpb24sIAotCQkJCQkJQXhpczJDb25zdGFudHMuRElSX1VOWklQKTsKLQkJCQlGaWxlIHRlbXBVbnppcExvY2F0aW9uRmlsZT0gbmV3IEZpbGUodGVtcFVuemlwTG9jYXRpb24pOwotCQkJCWlmICghdGVtcFVuemlwTG9jYXRpb25GaWxlLmV4aXN0cygpKSB7Ci0JCQkJCXRlbXBVbnppcExvY2F0aW9uRmlsZS5ta2RpcnMoKTsKLQkJCQl9Ci0JCQkJdW56aXBBeGlzMldhcih0ZW1wV2FyRmlsZSx0ZW1wVW56aXBMb2NhdGlvbiApOwotCi0JCQkJfQotCQkJCi0JCQlJUGF0aCB0ZW1wV2ViWE1MTG9jYXRpb25QYXRoID0gbmV3IFBhdGgodGVtcFVuemlwTG9jYXRpb24pCi0JCQkJCQkJCQkJCSAgIC5hcHBlbmQoQXhpczJDb25zdGFudHMuRElSX1dFQl9JTkYpCi0JCQkJCQkJCQkJCSAgIC5hcHBlbmQoQXhpczJDb25zdGFudHMuRklMRV9XRUJfWE1MKTsKLQkJCS8vZGVsZXRlIHRoZSBheGlzMiB3ZWIueG1sIEZpbGUoRFdQIGFscmVhZHkgaGF2ZSkKLQkJCW5ldyBGaWxlKHRlbXBXZWJYTUxMb2NhdGlvblBhdGgudG9PU1N0cmluZygpKS5kZWxldGUoKTsKLQkJCQkKLQkJCS8vfSBlbHNlIHsKLQkJCQkvL1Rocm93cyBhbiBlcnJvciBtZXNzYWdlCi0JCQkvL30KLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7CQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9Ci0KLQkJcmV0dXJuIHRlbXBVbnppcExvY2F0aW9uOwotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHVuemlwQXhpczJXYXIoU3RyaW5nIGZpbGVOYW1lLFN0cmluZyBvdXRwdXRQYXRoKXsKLQkgICAgICBiID0gbmV3IGJ5dGVbODA5Ml07Ci0JICAgICAgc2V0T3V0cHV0UGF0aChvdXRwdXRQYXRoKTsKLQkgICAgICBpZiAoZmlsZU5hbWUuZW5kc1dpdGgoIi53YXIiKSApCi0JICAgICAgICB1blppcChmaWxlTmFtZSk7Ci0JICAgICAgZWxzZQotCSAgICAJICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJXcm9uZyBmaWxlIHR5cGUiICsgZmlsZU5hbWUpOwotCX0KLQotCS8qKiBGb3IgYSBnaXZlbiBaaXAgZmlsZSwgcHJvY2VzcyBlYWNoIGVudHJ5LiAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1blppcChTdHJpbmcgZmlsZU5hbWUpIHsKLQkKLQkgIGNyZWF0ZWREaXJzID0gbmV3IFRyZWVTZXQoKTsKLQkgIHRyeSB7Ci0JICAgIHppcEZpbGUgPSBuZXcgWmlwRmlsZShmaWxlTmFtZSk7Ci0JICAgIEVudW1lcmF0aW9uIGFsbCA9IHppcEZpbGUuZW50cmllcygpOwotCSAgICB3aGlsZSAoYWxsLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JICAgICAgdW56aXBGaWxlKChaaXBFbnRyeSkgYWxsLm5leHRFbGVtZW50KCkpOwotCSAgICB9Ci0JICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JICB9Ci0JfQotCi0JCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHVuemlwRmlsZShaaXBFbnRyeSBlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JICBib29sZWFuIHdhcm5lZE1rRGlyID0gZmFsc2U7Ci0JICAgIFN0cmluZyB6aXBOYW1lID0gZS5nZXROYW1lKCk7Ci0JICAgIHN3aXRjaCAobW9kZSkgewotCSAgICBjYXNlIFVOWklQOgotCSAgICAgIGlmICh6aXBOYW1lLnN0YXJ0c1dpdGgoIi8iKSkgewotCSAgICAgICAgaWYgKCF3YXJuZWRNa0RpcikKLQkgICAgICAgIHdhcm5lZE1rRGlyID0gdHJ1ZTsKLQkgICAgICAgIHppcE5hbWUgPSB6aXBOYW1lLnN1YnN0cmluZygxKTsKLQkgICAgICB9Ci0JICAgICAgaWYgKHppcE5hbWUuZW5kc1dpdGgoIi8iKSkgewotCSAgICAgICAgcmV0dXJuOwotCSAgICAgIH0KLQkgICAgICBpbnQgaXggPSB6aXBOYW1lLmxhc3RJbmRleE9mKCcvJyk7Ci0JICAgICAgaWYgKGl4ID4gMCkgewotCSAgICAgICAgU3RyaW5nIGRpck5hbWUgPSB6aXBOYW1lLnN1YnN0cmluZygwLCBpeCk7Ci0JICAgICAgICBpZiAoIWNyZWF0ZWREaXJzLmNvbnRhaW5zKGRpck5hbWUpKSB7Ci0JICAgICAgICAgIEZpbGUgZCA9IG5ldyBGaWxlKGdldE91dHB1dFBhdGgoKStGaWxlLnNlcGFyYXRvcitkaXJOYW1lKTsKLQkgICAgICAgICAgaWYgKCEoZC5leGlzdHMoKSAmJiBkLmlzRGlyZWN0b3J5KCkpKSB7Ci0JICAgICAgICAgICAgaWYgKCFkLm1rZGlycygpKSB7Ci0JICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJXYXJuaW5nOiB1bmFibGUgdG8gbWtkaXIgIiArIGRpck5hbWUpOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgICBjcmVhdGVkRGlycy5hZGQoZGlyTmFtZSk7Ci0JICAgICAgICAgIH0KLQkgICAgICAgIH0KLQkgICAgICB9Ci0gICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGdldE91dHB1dFBhdGgoKStGaWxlLnNlcGFyYXRvcit6aXBOYW1lKTsKLQkgICAgICBJbnB1dFN0cmVhbSBpcyA9IHppcEZpbGUuZ2V0SW5wdXRTdHJlYW0oZSk7Ci0JICAgICAgaW50IG4gPSAwOwotCSAgICAgIHdoaWxlICgobiA9IGlzLnJlYWQoYikpID4gMCkKLQkgICAgICAgIG9zLndyaXRlKGIsIDAsIG4pOwotCSAgICAgIGlzLmNsb3NlKCk7Ci0JICAgICAgb3MuY2xvc2UoKTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJtb2RlIHZhbHVlICgiICsgbW9kZSArICIpIGJhZCIpOwotCSAgICB9Ci0JICB9Ci0KLQkKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE91dHB1dFBhdGgoKSB7Ci0JCXJldHVybiBvdXRwdXRQYXRoOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldE91dHB1dFBhdGgoU3RyaW5nIG91dHB1dFBhdGgpIHsKLQkJQXhpczJSdW50aW1lVXRpbHMub3V0cHV0UGF0aCA9IG91dHB1dFBhdGg7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEF4aXMyU2VydmxldEFkbWluQ2xhc3MoSVByb2plY3QgcHJvamVjdCl7Ci0JCVN0cmluZ1tdIGNsYXNzTmFtZXM9bmV3IFN0cmluZ1tdeyJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkF4aXNBZG1pblNlcnZsZXQiICwKLQkJCQkib3JnLmFwYWNoZS5heGlzMi53ZWJhcHAuQXhpc0FkbWluU2VydmxldCJ9Oy8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGRlZmF1bHRDbGFzc05hbWU9Y2xhc3NOYW1lc1swXTsKLQkJU3RyaW5nIHNlbGVjdGVkQ2xhc3NOYW1lPW51bGw7Ci0JCVN0cmluZyBheGlzMldDTGliUGF0aCA9IEZhY2V0Q29udGFpbmVyVXRpbHMuZ2V0QXhpczJXZWJDb250YWluZXJMaWJQYXRoKHByb2plY3QpOwotCQlGaWxlIGxpYkZvbGRlciA9IG5ldyBGaWxlKGF4aXMyV0NMaWJQYXRoKTsKLQkJRmlsZVtdIGxpYnMgPSBsaWJGb2xkZXIubGlzdEZpbGVzKCk7Ci0JCUFudENsYXNzTG9hZGVyIGFudENsYXNzTG9hZGVyID0gbmV3IEFudENsYXNzTG9hZGVyKCk7Ci0JCWFudENsYXNzTG9hZGVyLnNldFBhcmVudEZpcnN0KGZhbHNlKTsKLQkJb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCBwYXRoID0gbmV3IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgobmV3IFByb2plY3QoKSk7Ci0JCXBhdGguc2V0UGF0aChGYWNldENvbnRhaW5lclV0aWxzLmdldEF4aXMyV2ViQ29udGFpbmVyd2ViaW5mQ2xhc3NQYXRoKHByb2plY3QpKTsKLQkJZm9yIChGaWxlIGxpYiA6IGxpYnMpIHsKLQkJCWlmIChsaWIuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5qYXIiKSl7Ci0JCQkJcGF0aC5zZXRQYXRoKGxpYi5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJYW50Q2xhc3NMb2FkZXIuc2V0Q2xhc3NQYXRoKHBhdGgpOwotCQkJCWZvcihTdHJpbmcgY2xhc3NOYW1lOmNsYXNzTmFtZXMpewotCQkJCQl0cnl7Ci0JCQkJCQlDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgZmFsc2UsIGFudENsYXNzTG9hZGVyKTsKLQkJCQkJCXNlbGVjdGVkQ2xhc3NOYW1lPWNsYXNzTmFtZTsKLQkJCQkJfWNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlMSl7Ci0JCQkJCQlpZiAoIWUxLmdldE1lc3NhZ2UoKS5jb250YWlucyhjbGFzc05hbWUpICYmICFlMS5nZXRDYXVzZSgpLmdldE1lc3NhZ2UoKS5jb250YWlucyhjbGFzc05hbWUpKSAvL2RlcGVuZGVudCBjbGFzcyBpcyBub3QgZm91bmQKLQkJCQkJCQlzZWxlY3RlZENsYXNzTmFtZT1jbGFzc05hbWU7Ci0JCQkJCQkvL2NsYXNzIG5vdCBmb3VuZAotCQkJCQl9Y2F0Y2goRXhjZXB0aW9uIGUpewotCQkJCQkJLy90aGUgY2xhc3MgaXMgbm90IGZvdW5kCi0JCQkJCX0KLQkJCQkJaWYgKHNlbGVjdGVkQ2xhc3NOYW1lIT1udWxsKSBicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoc2VsZWN0ZWRDbGFzc05hbWUhPW51bGwpIGJyZWFrOwotCQl9Ci0JCWFudENsYXNzTG9hZGVyLmNsZWFudXAoKTsKLQkJaWYgKHNlbGVjdGVkQ2xhc3NOYW1lPT1udWxsKSBzZWxlY3RlZENsYXNzTmFtZT1kZWZhdWx0Q2xhc3NOYW1lOwotCQlyZXR1cm4gc2VsZWN0ZWRDbGFzc05hbWU7Ci0JfQotCQkgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvZmFjZXQvdXRpbHMvQXhpczJXZWJhcHBVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2ZhY2V0L3V0aWxzL0F4aXMyV2ViYXBwVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE1Mzg4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvZmFjZXQvdXRpbHMvQXhpczJXZWJhcHBVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDQxMCAxNjg3NjYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgQXhpczIgCi0gKiAJCQkJCQkJCQkJICBmYWNldCB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjYKLSAqIDIwMDcwNDI2ICAgMTgzMDQ2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSAqIDIwMDcwNTAxICAgMTgwMjg0IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSAqIDIwMDcwNTA3ICAgMTg1Njg2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSAqIDIwMDcwNTE2ICAgMTgzMTQ3IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGggRml4IGZvciB0aGUgcGVyc2lzdGluZyBEQkNTIHBhdGhzCi0gKiAyMDA3MDUyMyAgIDE3NDg3NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBQZXJzaXN0IFByZWZlcmVuY2VzIGluc2lkZSBGcmFtZXdvcmsKLSAqIDIwMDcwNzMwICAgMTk0Nzg2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIGFkZGluZyBzZXJ2bGV0YXBpIGphciBmaWx0ZXIKLSAqIDIwMDcwODI0ICAgMjAwNTE1IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIE5PTi1OTFMgbW92ZSB0byBzZXBlcmF0ZSBmaWxlCi0gKiAyMDA3MTEyMCAgIDIwNTIyOCBzYW5kYWtpdGhAd3NvMi5jb20JLSBMYWhpcnUgU2FuZGFraXRoLCBBeGlzMiBSdW50aW1lIGNoYW5nZSBpc3N1ZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuZmFjZXQudXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLmNvbnN0YW50LkF4aXMyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLmNvbnRleHQuQXhpczJFbWl0dGVyQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5wbHVnaW4uV2ViU2VydmljZUF4aXMyQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS51dGlscy5BeGlzMkNvcmVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS51dGlscy5GaWxlVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBBeGlzMldlYmFwcFV0aWxzIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyB0ZW1wV2FyTG9jYXRpb24gPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gYWxyZWFkeVdhckV4aXN0ID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgQXhpczJFbWl0dGVyQ29udGV4dCBjb250ZXh0OwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBheGlzMkhvbWVMb2NhdGlvbiA9IG51bGw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyAgY29weUF4aXMyV2FyKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgU3RyaW5nIEF4aXMySG9tZSkKLQkJCQkJCQkJCQl0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbnsKLQkJY29udGV4dCA9IFdlYlNlcnZpY2VBeGlzMkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEF4aXNFbWl0dGVyQ29udGV4dCgpOwotCi0JCWlmKCAhICggYWxyZWFkeVdhckV4aXN0ICYmIGNvbnRleHQuZ2V0QXhpczJSdW50aW1lTG9jYXRpb24oKS5lcXVhbHMoYXhpczJIb21lTG9jYXRpb24pICkpewotCQkJaWYoY29udGV4dC5nZXRBeGlzMlJ1bnRpbWVMb2NhdGlvbigpICE9IG51bGwpewotCQkJCWF4aXMySG9tZUxvY2F0aW9uID0gY29udGV4dC5nZXRBeGlzMlJ1bnRpbWVMb2NhdGlvbigpOwotCQkJfQotCQkJRmlsZSB0ZW1wQXhpczJEaXJlY3RvcnkgPSBuZXcgRmlsZSAoQXhpczJDb3JlVXRpbHMudGVtcEF4aXMyRGlyZWN0b3J5KCkpOwotCQkJaWYoIXRlbXBBeGlzMkRpcmVjdG9yeS5leGlzdHMoKSl7Ci0JCQkJdGVtcEF4aXMyRGlyZWN0b3J5Lm1rZGlycygpOwotCQkJfQotCQkJaWYgKHRlbXBBeGlzMkRpcmVjdG9yeS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJdGVtcFdhckxvY2F0aW9uID0gQXhpczJDb3JlVXRpbHMuYWRkQW5vdGhlck5vZGVUb1BhdGgoCi0JCQkJCQlBeGlzMkNvcmVVdGlscy50ZW1wQXhpczJEaXJlY3RvcnkoKSwKLQkJCQkJCUF4aXMyQ29uc3RhbnRzLkRJUl9FWFBMT0FERURfVEVNUFdBUik7Ci0JCQkJRmlsZSB0ZW1wV2FyTG9jYXRpb25GaWxlPSBuZXcgRmlsZSh0ZW1wV2FyTG9jYXRpb24pOwotCQkJCWlmICh0ZW1wV2FyTG9jYXRpb25GaWxlLmV4aXN0cygpKSB7Ci0JCQkJCUZpbGVVdGlscy5kZWxldGVEaXJlY3Rvcmllcyh0ZW1wV2FyTG9jYXRpb25GaWxlKTsKLQkJCQl9Ci0JCQkJdGVtcFdhckxvY2F0aW9uRmlsZS5ta2RpcnMoKTsKLQkJCi0JCQkJCVN0cmluZyBheGlzMldlYmFwcExvY2F0aW9uID0gQXhpczJDb3JlVXRpbHMuYWRkQW5vdGhlck5vZGVUb1BhdGgoCi0JCQkJCQkJYXhpczJIb21lTG9jYXRpb24sCi0JCQkJCQkJIndlYmFwcCIpOwotCQkJCQlTdHJpbmcgYXhpczJMaWJGaWxlID0gQXhpczJDb3JlVXRpbHMuYWRkQW5vdGhlck5vZGVUb1BhdGgoCi0JCQkJCQkJYXhpczJIb21lTG9jYXRpb24sCi0JCQkJCSJsaWIiKTsKLQkJCQkJU3RyaW5nIGF4aXMyQ29uZkZpbGUgPSBBeGlzMkNvcmVVdGlscy5hZGRBbm90aGVyTm9kZVRvUGF0aCgKLQkJCQkJCQlheGlzMkhvbWVMb2NhdGlvbiwKLQkJCQkJImNvbmYiKTsKLQkJCQkJU3RyaW5nIGF4aXMyUmVwb3NpdG9yeUZpbGUgPSBBeGlzMkNvcmVVdGlscy5hZGRBbm90aGVyTm9kZVRvUGF0aCgKLQkJCQkJCQlheGlzMkhvbWVMb2NhdGlvbiwKLQkJCQkJInJlcG9zaXRvcnkiKTsKLQkJCQkJU3RyaW5nIGF4aXMyVGVtcFdlYkluZkZpbGUgPSBBeGlzMkNvcmVVdGlscy5hZGRBbm90aGVyTm9kZVRvUGF0aCgKLQkJCQkJCQl0ZW1wV2FyTG9jYXRpb24sCi0JCQkJCSJXRUItSU5GIik7Ci0JCQkJCVN0cmluZyBheGlzMlRlbXBXZWJJbmZMaWJGaWxlID0gQXhpczJDb3JlVXRpbHMuYWRkQW5vdGhlck5vZGVUb1BhdGgoCi0JCQkJCQkJYXhpczJUZW1wV2ViSW5mRmlsZSwKLQkJCQkJImxpYiIpOwotCQkJCQlTdHJpbmcgYXhpczJUZW1wV2ViSW5mQ29uZkZpbGUgPSBBeGlzMkNvcmVVdGlscy5hZGRBbm90aGVyTm9kZVRvUGF0aCgKLQkJCQkJCQlheGlzMlRlbXBXZWJJbmZGaWxlLAotCQkJCQkiY29uZiIpOwotCQkJCQlTdHJpbmcgYXhpczJUZW1wV2ViQnVpbGRGaWxlID0gQXhpczJDb3JlVXRpbHMuYWRkQW5vdGhlck5vZGVUb1BhdGgoCi0JCQkJCQkJdGVtcFdhckxvY2F0aW9uLAotCQkJCQkiYnVpbGQueG1sIik7Ci0JCQkJCVN0cmluZyBheGlzMlRlbXBXZWJYTUxGaWxlID0gQXhpczJDb3JlVXRpbHMuYWRkQW5vdGhlck5vZGVUb1BhdGgoCi0JCQkJCQkJYXhpczJUZW1wV2ViSW5mRmlsZSwKLQkJCQkJCQlBeGlzMkNvbnN0YW50cy5GSUxFX1dFQl9YTUwpOwotCi0JCQkJCS8vQ29weSB0aGUgd2ViYXBwIGNvbnRlbnQgCi0JCQkJCUZpbGVVdGlscy5jb3B5RGlyZWN0b3J5KG5ldyBGaWxlKGF4aXMyV2ViYXBwTG9jYXRpb24pLCB0ZW1wV2FyTG9jYXRpb25GaWxlKTsKLQkJCQkJLy8vL2RlbGV0ZSB0aGUgYXhpczIgd2ViLnhtbCBGaWxlKERXUCBhbHJlYWR5IGhhdmUpCi0JCQkJCW5ldyBGaWxlKGF4aXMyVGVtcFdlYkJ1aWxkRmlsZSkuZGVsZXRlKCk7Ci0JCQkJCS8vZGVsZXRlIHRoZSB3ZWIueG1sIEZpbGUKLQkJCQkJbmV3IEZpbGUoYXhpczJUZW1wV2ViWE1MRmlsZSkuZGVsZXRlKCk7Ci0JCQkJCS8vQ29weSBsaWJzIAotCQkJCQlGaWxlVXRpbHMuY29weURpcmVjdG9yeShuZXcgRmlsZShheGlzMkxpYkZpbGUpLAotCQkJCQkJCQkJCQluZXcgRmlsZShheGlzMlRlbXBXZWJJbmZMaWJGaWxlKSk7Ci0JCQkJCS8vY29weSBjb25mL2F4aXMyLnhtbAotCQkJCQlGaWxlVXRpbHMuY29weURpcmVjdG9yeShuZXcgRmlsZShheGlzMkNvbmZGaWxlKSwgCi0JCQkJCQkJCQkJCW5ldyBGaWxlKGF4aXMyVGVtcFdlYkluZkNvbmZGaWxlKSk7Ci0JCQkJCS8vQ29weSBtb2R1bGVzIGFuZCBzZXJ2aWNlcyAJCQkJCQotCQkJCQlGaWxlVXRpbHMuY29weURpcmVjdG9yeShuZXcgRmlsZShheGlzMlJlcG9zaXRvcnlGaWxlKSwgCi0JCQkJCQkJCQkJCW5ldyBGaWxlKGF4aXMyVGVtcFdlYkluZkZpbGUpKTsKLQkJCQkJLy9GaWx0ZXIgb3V0IHRoZSBzZXJ2bGV0YXBpIGphcnMKLQkJCQkJRmlsZVV0aWxzLmZpbHRlck91dFJlc3RyaWN0ZWRGaWxlcyhheGlzMlRlbXBXZWJJbmZMaWJGaWxlLAotCQkJCQkJCUF4aXMyQ29uc3RhbnRzLkZJTEVfU0VSVkxFVF9BUEksImphciIpOwotCQkJCQkKLQkJCQkJYWxyZWFkeVdhckV4aXN0PSB0cnVlOwotCQkJCX0KLQotCQl9CQotCQlyZXR1cm4gdGVtcFdhckxvY2F0aW9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2ZhY2V0L3V0aWxzL0NvbnRlbnRDb3B5VXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9mYWNldC91dGlscy9Db250ZW50Q29weVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5YjFkY2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2ZhY2V0L3V0aWxzL0NvbnRlbnRDb3B5VXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiwgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBJQk0gQ29ycG9yYXRpb24sICBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgZXh0ZW5kZWQgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogMjAwNzAyMTMgIDE2ODc2NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiAKLSAqIAkJCQkJCQkJCQkgIGZhY2V0IHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2NgotICogMjAwNzA0MjYgICAxODMwNDYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aAotICogMjAwNzA2MDYgICAxNzc0MjEgc2FuZGFraXRoQHdzbzIuY29tIC0gZml4IHdlYi54bWwgd2lwZWQgb3V0IHdoZW4gQXhpczIgZmFjZXQKLSAqIDIwMDcwODA4ICAgMTk0OTA2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEZpeGluZyAxOTQ5MDYgUnVudGltZSBsaWIgaXNzdWUKLSAqIDIwMDcwODEzICAgMTk2MTczICBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBGaXggMTk2MTczLCBEV1AgY3VzdG9tIGxvY2F0aW9uIGZpeAotICogMjAwODA2MTYgICAyMzczNjMgc2FtaW5kYXdAd3NvMi5jb20gLSBTYW1pbmRhIFdpamVyYXRuZSwgZ2V0IFJlc291cmNlQ29udGV4dCBmcm9tIGVudmlyb25tZW50IGluc3RlYWQgb2YgcHJlZmVyZW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5mYWNldC51dGlsczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLnBsdWdpbi5tZXNzYWdlcy5BeGlzMkNvcmVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb250ZXh0LlJlc291cmNlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuZWNsaXBzZS5CYXNlRWNsaXBzZUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotCi1wdWJsaWMgY2xhc3MgQ29udGVudENvcHlVdGlscyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBJV29ya3NwYWNlUm9vdCByb290XyA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgSVdvcmtzcGFjZSB3b3Jrc3BhY2VfID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZmlsZUFuZERpcmVjdG9yaWVzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQlGaWxlSW5wdXRTdHJlYW0gZmluU3RyZWFtID0gbnVsbDsJCQotCXByaXZhdGUgTGlzdCBjaGVja0xpc3QgPSBudWxsOwotCXByaXZhdGUgSUVudmlyb25tZW50IGVudmlyb25tZW50OwotCi0JcHVibGljIENvbnRlbnRDb3B5VXRpbHMoSUVudmlyb25tZW50IGVudil7Ci0JCWVudmlyb25tZW50ID0gZW52OwotCX0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGNvcHkgdGhlIHNvdXJjZSBkaXJlY3RvcnkgaW50byB0aGUgZWNsaXBzZSB3b3Jrc3BhY2UgCi0JICogYWNjb3JkaW5nIHRvIHRoZSBFY2xpcHNlIEZyYW1ld29yayBBUEkKLQkgKiBAcGFyYW0gc291cmNlRGlyCi0JICogQHBhcmFtIGRlc3RpbmF0aW9uRGlyCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAcGFyYW0gc3RhdHVzSGFuZGxlcgotCSAqIEByZXR1cm4gSVN0YXR1cyA6IFN0YXR1cyBvZiB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIElTdGF0dXMgY29weURpcmVjdG9yeVJlY3Vyc2l2ZWx5SW50b1dvcmtzcGFjZShTdHJpbmcgc291cmNlRGlyLCAKLQkJCQkJCVN0cmluZyBkZXN0aW5hdGlvbkRpcixJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGJvb2xlYW4gaW5jbHVkZUxpc3RTZXQpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQkvL0ZpcnN0IG9mIGFsbCBjbGVhciB0aGUgY29udGVudCBpbiB0aGUgdGFyZ2V0ZWQgbGlzdAotCQlmaWxlQW5kRGlyZWN0b3JpZXNMaXN0LmNsZWFyKCk7Ci0JCUZpbGUgYXhpczJXZWJhcHBGb2xkZXIgPSBuZXcgRmlsZShzb3VyY2VEaXIpOwotCQlpZiAoaW5jbHVkZUxpc3RTZXQpIHsKLQkJCXZpc2l0QWxsRGlyc0FuZEZpbGVzV2l0aEluY2x1ZGVMaXN0KGF4aXMyV2ViYXBwRm9sZGVyLGNoZWNrTGlzdCk7Ci0JCX1lbHNlewotCQkJdmlzaXRBbGxEaXJzQW5kRmlsZXNXaXRoSWdub3JlTGlzdChheGlzMldlYmFwcEZvbGRlcixjaGVja0xpc3QpOwotCQl9Ci0JCQotCQlMaXN0IGRlcGxveUZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlkZXBsb3lGaWxlcz0gZmlsZUFuZERpcmVjdG9yaWVzTGlzdDsKLQotCQl0cnkgewotCi0JCQkvL0ltcG9ydCB0aGUgYXhpczIgZGVwZW5kZW5jeSBwbHVnaW4gYWNjb3JkaW5nIHRvIHRoZSBSZXNvdXJjZXMgQVBJIG9mIGVjbGlwc2UgCi0JCQlSZXNvdXJjZUNvbnRleHQgY29udGV4dDsKLQkJCWlmIChlbnZpcm9ubWVudD09bnVsbCkKLQkJCQljb250ZXh0ID0gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFJlc291cmNlQ29udGV4dCgpOwotCQkJZWxzZQotCQkJCWNvbnRleHQgPSAoKEJhc2VFY2xpcHNlRW52aXJvbm1lbnQpIGVudmlyb25tZW50KS5nZXRSZXNvdXJjZUNvbnRleHQoKTsJCi0JCQkKLQkJCUlQYXRoIG91dHB1dFBhdGggPSBuZXcgUGF0aCAoZGVzdGluYXRpb25EaXIpOwotCi0JCQlTdHJpbmcgZmlsZU5hbWU7Ci0JCQlJUGF0aCB0YXJnZXRQYXRoPW51bGw7Ci0JCQlib29sZWFuIGlzRGlyZWN0b3J5ID0gZmFsc2U7Ci0KLQkJCVN0cmluZyBkZXBsb3lGaWxlOwotCQkJSXRlcmF0b3IgaXRlcmF0b3I7Ci0KLQkJCVN0cmluZyB0ZW1wT3V0cHV0RGlyID0gYXhpczJXZWJhcHBGb2xkZXIudG9TdHJpbmcoKTsKLQkJCWl0ZXJhdG9yID0gZGVwbG95RmlsZXMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlkZXBsb3lGaWxlID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJCUZpbGUgc291cmNlID0gbmV3IEZpbGUoZGVwbG95RmlsZSk7Ci0JCQkJaWYgKHNvdXJjZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCWlzRGlyZWN0b3J5ID10cnVlOwotCQkJCX1lbHNlewotCQkJCQlpc0RpcmVjdG9yeT1mYWxzZTsKLQkJCQkJZmluU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzb3VyY2UpOwotCQkJCX0KLQotCQkJCWlmIChkZXBsb3lGaWxlLnN0YXJ0c1dpdGgodGVtcE91dHB1dERpcikpIHsKLQkJCQkJZmlsZU5hbWUgPSBkZXBsb3lGaWxlLnN1YnN0cmluZyh0ZW1wT3V0cHV0RGlyLmxlbmd0aCgpKTsKLQkJCQkJdGFyZ2V0UGF0aCA9IG91dHB1dFBhdGguYXBwZW5kKGZpbGVOYW1lKS5tYWtlQWJzb2x1dGUoKTsKLQkJCQkJaWYgKGlzRGlyZWN0b3J5KXsKLQkJCQkJCW1ha2VGb2xkZXJQYXRoQXRMb2NhdGlvbihjb250ZXh0LCAgCi0JCQkJCQkJCXRhcmdldFBhdGgsCi0JCQkJCQkJCW1vbml0b3IpOwotCQkJCQl9ZWxzZXsKLQkJCQkJCWlmIChmaW5TdHJlYW0gIT0gbnVsbCkgewotCQkJCQkJCWNyZWF0ZUZpbGVBdExvY2F0aW9uKGNvbnRleHQsICAKLQkJCQkJCQkJCXRhcmdldFBhdGgsCi0JCQkJCQkJCQlmaW5TdHJlYW0sCi0JCQkJCQkJCQltb25pdG9yKTsKLQkJCQkJCX0KLQkJCQkJCWZpblN0cmVhbS5jbG9zZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cygKLQkJCQkJTkxTLmJpbmQoQXhpczJDb3JlVUlNZXNzYWdlcy5FUlJPUl9JTlZBTElEX0ZJTEVfUkVBRF9XUklURUwsCi0JCQkJCQkJIG5ldyBTdHJpbmdbXXtlLmdldExvY2FsaXplZE1lc3NhZ2UoKX0pLCBlKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cygKLQkJCQkJTkxTLmJpbmQoQXhpczJDb3JlVUlNZXNzYWdlcy5FUlJPUl9JTlZBTElEX0ZJTEVfUkVBRF9XUklURUwsCi0JCQkJCQkJIG5ldyBTdHJpbmdbXXtlLmdldExvY2FsaXplZE1lc3NhZ2UoKX0pLCBlKTsKLQkJfQotCi0JCXJldHVybiBzdGF0dXM7Ci0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlQ2hlY2tMaXN0KExpc3QgbGlzdCl7Ci0JCWNoZWNrTGlzdCA9IGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgbGlzdCB3aXRoIGRpcmVjdG9yeSBjb250ZW50cyAoZmlsZXMvZm9sZGVycykgZXhjbHVkaW5nIHRoZSBpZ25vcmUgbGlzdAotCSAqIEBwYXJhbSBkaXIKLQkgKiBAcGFyYW0gaWdub3JlTGlzdAotCSAqLwotCXByaXZhdGUgdm9pZCB2aXNpdEFsbERpcnNBbmRGaWxlc1dpdGhJZ25vcmVMaXN0KEZpbGUgZGlyLCBMaXN0IGlnbm9yZUxpc3QpIHsKLQkJaWYoIWNoZWNrQ2hlY2tMaXN0SGl0KGRpcixpZ25vcmVMaXN0KSl7Ci0JCQlmaWxlQW5kRGlyZWN0b3JpZXNMaXN0LmFkZChkaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJaWYgKGRpci5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJU3RyaW5nW10gY2hpbGRyZW4gPSBkaXIubGlzdCgpOwotCQkJCWZvciAoaW50IGk9MDsgaTxjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCQl2aXNpdEFsbERpcnNBbmRGaWxlc1dpdGhJZ25vcmVMaXN0KG5ldyBGaWxlKGRpciwgY2hpbGRyZW5baV0pLGlnbm9yZUxpc3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBMb2FkIHRoZSBsaXN0IHdpdGggZGlyZWN0b3J5IGNvbnRlbnRzIChmaWxlcy9mb2xkZXJzKSBvbmx5IG1hdGNoIHdpdGggdGhlIGluY2x1ZGUgbGlzdCAKLQkgKiBAcGFyYW0gZGlyCi0JICogQHBhcmFtIGluY2x1ZGVMaXN0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHZpc2l0QWxsRGlyc0FuZEZpbGVzV2l0aEluY2x1ZGVMaXN0KEZpbGUgZGlyLCBMaXN0IGluY2x1ZGVMaXN0KSB7Ci0JCWlmKGNoZWNrQ2hlY2tMaXN0SGl0KGRpcixpbmNsdWRlTGlzdCkpewotCQkJZmlsZUFuZERpcmVjdG9yaWVzTGlzdC5hZGQoZGlyLmdldEFic29sdXRlUGF0aCgpKTsKLQkJfQotCQlpZiAoZGlyLmlzRGlyZWN0b3J5KCkpIHsKLQkJCVN0cmluZ1tdIGNoaWxkcmVuID0gZGlyLmxpc3QoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCXZpc2l0QWxsRGlyc0FuZEZpbGVzV2l0aEluY2x1ZGVMaXN0KG5ldyBGaWxlKGRpciwgY2hpbGRyZW5baV0pLGluY2x1ZGVMaXN0KTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDaGVjayB0aGUgPGNvZGU+ZmlsZTwvY29kZT4gcGFzcyBpbiwgbWF0Y2hlcyBhIGZpbGUgaW4gdGhlIDxjb2RlPmxpc3Q8L2NvZGU+Ci0JICogQHBhcmFtIGZpbGUgCi0JICogQHBhcmFtIGxpc3QKLQkgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgY2hlY2sKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tDaGVja0xpc3RIaXQoRmlsZSBmaWxlLCBMaXN0IGxpc3QpewotCQlpZihsaXN0ICE9IG51bGwpewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJU3RyaW5nIGVsZW0gPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYoZWxlbS5lcXVhbHMoZmlsZS5nZXRBYnNvbHV0ZUZpbGUoKS50b1N0cmluZygpKSl7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIElGb2xkZXIgbWFrZUZvbGRlciAoCi0JCSAgICBSZXNvdXJjZUNvbnRleHQgIHJlc291cmNlQ29udGV4dCwKLQkJICAgIElDb250YWluZXIgICAgICAgcGFyZW50LAotCQkgICAgU3RyaW5nICAgICAgICAgICBmb2xkZXJOYW1lLAotCQkgICAgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IgKQotCQkgIAotCQkgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JCSAgewotCQkgICAgSVJlc291cmNlIGNoaWxkICA9IHBhcmVudC5maW5kTWVtYmVyKGZvbGRlck5hbWUpOwotCQkgICAgaWYoIGNoaWxkID09IG51bGwgKQotCQkgICAgewotCQkgICAgICBJRm9sZGVyIGZvbGRlciA9IHBhcmVudC5nZXRGb2xkZXIobmV3IFBhdGgoZm9sZGVyTmFtZSkpOwotCQkgICAgICBmb2xkZXIuY3JlYXRlKHRydWUsdHJ1ZSxudWxsKTsKLQkJICAgICAgcmV0dXJuIGZvbGRlcjsKLQkJICAgIH0KLQkJICAgIGVsc2UgaWYoIGNoaWxkLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSICkKLQkJICAgIHsKLQkJICAgICAgcmV0dXJuIChJRm9sZGVyKWNoaWxkOwotCQkgICAgfQotCQkgICAgZWxzZQotCQkgICAgewotCQkgICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbigKLQkJICAgICAgICBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCAKLQkJICAgICAgICAgICAgICAgICAgICAiUmVzb3VyY2VVdGlscyIsCi0JCSAgICAgICAgICAgICAgICAgICAgMCwgCi0JCSAgICAgICAgICAgICAgICAgICAgTkxTLmJpbmQoIkVSUk9SIiwvL0Vudmlyb25tZW50TWVzc2FnZXMuTVNHX0VSUk9SX1JFU09VUkNFX05PVF9GT0xERVIsCi0JCQkJCQkJICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117IHBhcmVudC5nZXRGdWxsUGF0aCgpLmFwcGVuZChmb2xkZXJOYW1lKS50b1N0cmluZygpIH0pLAotCQkJCQludWxsICkgKTsKLQkJICAgIH0KLQkJICB9Ci0KLQkKLQlwdWJsaWMgc3RhdGljIElDb250YWluZXIgbWFrZUZvbGRlclBhdGhBdExvY2F0aW9uICgKLQkJCSAgIFJlc291cmNlQ29udGV4dCAgcmVzb3VyY2VDb250ZXh0LAotCQkJICAgSUNvbnRhaW5lciAgICAgICByZXNvdXJjZSwKLQkJCSAgIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yICkKLQkJCSAKLQkJCSAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JCQkgICB7Ci0JCQkJIGlmIChyZXNvdXJjZS5leGlzdHMoKSkKLQkJCQkgewotCQkJCQkgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUNvbnRhaW5lcikKLQkJCQkJIHsKLQkJCQkJCSByZXR1cm4gKElDb250YWluZXIpIHJlc291cmNlOwotCQkJCQkgfQotCQkJCQkgZWxzZQotCQkJCQkgewotCQkJCQkJIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAotCQkJCQkJCQkgbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgCi0JCQkJCQkJCQkJICJSZXNvdXJjZVV0aWxzIiwKLQkJCQkJCQkJCQkgMCwgCi0JCQkJCQkJCQkJIE5MUy5iaW5kKCJFUlJPUiIsCi0JCQkJCQkJCQkJCQkgbmV3IE9iamVjdFtdeyByZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkgfSksCi0JCQkJCQkJCQkJCQkgbnVsbCApICk7Ci0JCQkJCSB9Ci0JCQkJIH0KLQkJCQkgZWxzZQotCQkJCSB7Ci0JCQkJCSBJQ29udGFpbmVyIHBhcmVudCA9IG1ha2VGb2xkZXJQYXRoQXRMb2NhdGlvbihyZXNvdXJjZUNvbnRleHQsIAotCQkJCQkJCSAJCQlyZXNvdXJjZS5nZXRQYXJlbnQoKSwgCi0JCQkJCQkJIAkJCXByb2dyZXNzTW9uaXRvciApOwotCQkJCQkgU3RyaW5nIGZvbGRlck5hbWUgPSByZXNvdXJjZS5nZXROYW1lKCk7Ci0JCQkJCSAKLQkJCQkJIHJldHVybiBtYWtlRm9sZGVyKHJlc291cmNlQ29udGV4dCwgcGFyZW50LCBmb2xkZXJOYW1lLCBwcm9ncmVzc01vbml0b3IgICk7Ci0JCQkJIH0KLQkJCSB9Ci0JCi0JCi0JIC8qKgotCSAgKiBDcmVhdGVzIGEgcGF0aCBvZiBmb2xkZXJzLgotCSAgKiBEbyBub3QgY2FsbCB3aXRoIGFuIGFic29sdXRlUGF0aCBvZiBsZXNzIHRoYW4gb25lIHNlZ21lbnQuCi0JICAqIEBwYXJhbSByZXNvdXJjZUNvbnRleHQgdGhlIHJlc291cmNlIGNvbnRleHQgZm9yIG1ha2luZyBmb2xkZXJzLgotCSAgKiBAcGFyYW0gYWJzb2x1dGVQYXRoIHRoZSBwYXRoIG9mIGZvbGRlcnMgdGhhdCB3aWxsIGJlIGNyZWF0ZWQuCi0JICAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IgdG8gYmUgdXNlZC4KLQkgICogQHBhcmFtIHN0YXR1c0hhbmRsZXIgdGhlIHN0YXR1cyBoYW5kbGVyLgotCSAgKiBAcmV0dXJuIHJldHVybnMgdGhlIElDb250YWluZXIgb2YgdGhlIGNyZWF0ZWQgZm9sZGVyLgotCSAgKi8KLQkgcHVibGljIHN0YXRpYyBJQ29udGFpbmVyIG1ha2VGb2xkZXJQYXRoQXRMb2NhdGlvbiAoCi0JICAgUmVzb3VyY2VDb250ZXh0ICByZXNvdXJjZUNvbnRleHQsCi0JICAgSVBhdGggICAgICAgICAgICBhYnNvbHV0ZVBhdGgsCi0JICAgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IgKQotCSAKLQkgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSB7Ci0JIAlyZXR1cm4gbWFrZUZvbGRlclBhdGhBdExvY2F0aW9uKHJlc291cmNlQ29udGV4dCwKLSAJCQlnZXRXb3Jrc3BhY2VSb290KCkuZ2V0Q29udGFpbmVyRm9yTG9jYXRpb24oYWJzb2x1dGVQYXRoKSwKLQkgCQkvL2dldFdvcmtzcGFjZVJvb3QoKS5nZXRDb250YWluZXJGb3JMb2NhdGlvbihuZXcgUGF0aCgiL2hvbWUvc2FuZGFraXRoL3RlbXAvVGVzdC9UZXN0L1dlYkNvbnRlbnQiKSksCi0JIAkJLy8iL2hvbWUvc2FuZGFraXRoL0VjbGlwc2VfV29ya3NwYWNlL3dvcmtzcGFjZS90ZXN0VGhpcyIKLQkgCQlwcm9ncmVzc01vbml0b3IpOwotCSB9Ci0JIAotCSAKLQkgcHVibGljIHN0YXRpYyBJV29ya3NwYWNlUm9vdCBnZXRXb3Jrc3BhY2VSb290ICgpCi0JICB7Ci0JICAgIGlmIChyb290XyA9PSBudWxsKQotCSAgICB7Ci0JICAgICAgcm9vdF8gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCSAgICB9Ci0JICAgIHJldHVybiByb290XzsKLQkgIH0KLQkKLQkgIHB1YmxpYyBzdGF0aWMgSUZpbGUgY3JlYXRlRmlsZUF0TG9jYXRpb24gKAotCQkJICAgICBSZXNvdXJjZUNvbnRleHQgcmVzb3VyY2VDb250ZXh0LAotCQkJICAgICBJUGF0aCAgICAgICAgICAgYWJzb2x1dGVQYXRoLAotCQkJICAgICBJbnB1dFN0cmVhbSAgICAgaW5wdXRTdHJlYW0sCi0JCQkgICAgIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yICkKLQotCQkJICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAKLQkJCSAgIHsgICAgCi0JCQkgICAgIGlmICghYWJzb2x1dGVQYXRoLmlzQWJzb2x1dGUoKSkKLQkJCSAgICAgewotCQkJICAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgIlJlc291cmNlVXRpbHMiLDAsCi0JCQkgICAgCQkgICBOTFMuYmluZCgiRVJST1IiLC8vRW52aXJvbm1lbnRNZXNzYWdlcy5NU0dfRVJST1JfUEFUSF9OT1RfQUJTT0xVVEUsCi0JCQkgICAgCQkgICBuZXcgT2JqZWN0W10ge2Fic29sdXRlUGF0aC50b1N0cmluZygpfSksbnVsbCkpOwotCQkJICAgICB9Ci0JCQkgICAgIGlmIChhYnNvbHV0ZVBhdGguc2VnbWVudENvdW50KCkgPCAxKQotCQkJICAgICB7Ci0JCQkgICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCJSZXNvdXJjZVV0aWxzIiwwLAotCQkJICAgIAkJICAgTkxTLmJpbmQoIkVSUk9SIiwvL0Vudmlyb25tZW50TWVzc2FnZXMuTVNHX0VSUk9SX1BBVEhfRU1QVFksCi0JCQkgICAgCQkgICBuZXcgT2JqZWN0W10ge2Fic29sdXRlUGF0aC50b1N0cmluZygpfSksbnVsbCkpOwotCQkJICAgICB9Ci0JCQkgICAgIGlmIChhYnNvbHV0ZVBhdGguc2VnbWVudENvdW50KCkgPCAyKQotCQkJICAgICB7Ci0JCQkgICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCJSZXNvdXJjZVV0aWxzIiwwLAotCQkJICAgIAkJICAgTkxTLmJpbmQoIkVSUk9SIiwvL0Vudmlyb25tZW50TWVzc2FnZXMuTVNHX0VSUk9SX1BBVEhfTk9UX0ZPTERFUiwKLQkJCSAgICAJCSAgIG5ldyBPYmplY3RbXSB7YWJzb2x1dGVQYXRoLnRvU3RyaW5nKCl9KSxudWxsKSk7Ci0JCQkgICAgIH0KLQkJCSAgICAgSUNvbnRhaW5lciBwYXJlbnQgICA9IG1ha2VGb2xkZXJQYXRoQXRMb2NhdGlvbihyZXNvdXJjZUNvbnRleHQsIAotCQkJICAgIAkJIAkJCQlhYnNvbHV0ZVBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLCBwcm9ncmVzc01vbml0b3IpOwotCQkJICAgICBTdHJpbmcgICAgIGZpbGVOYW1lID0gYWJzb2x1dGVQYXRoLmxhc3RTZWdtZW50KCk7Ci0JCQkgICAgIAotCQkJICAgICByZXR1cm4gbWFrZUZpbGUocmVzb3VyY2VDb250ZXh0LCBwYXJlbnQsIGZpbGVOYW1lLCBpbnB1dFN0cmVhbSwgcHJvZ3Jlc3NNb25pdG9yKTsKLQkJCSAgIH0KLQkKLQkKLQkgIHByaXZhdGUgc3RhdGljIElGaWxlIG1ha2VGaWxlICgKLQkJCSAgICBSZXNvdXJjZUNvbnRleHQgIHJlc291cmNlQ29udGV4dCwKLQkJCSAgICBJQ29udGFpbmVyICAgICAgIHBhcmVudCwKLQkJCSAgICBTdHJpbmcgICAgICAgICAgIGZpbGVOYW1lLAotCQkJICAgIElucHV0U3RyZWFtICAgICAgaW5wdXRTdHJlYW0sCi0JCQkgICAgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IgKQotCQkJIAotCQkJICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JCQkgIHsKLQkJCSAgICBJUmVzb3VyY2UgY2hpbGQgID0gcGFyZW50LmZpbmRNZW1iZXIoZmlsZU5hbWUpOwotCQkJICAgIAotCQkJICAgIGlmKCBjaGlsZCAhPSBudWxsICkKLQkJCSAgICB7Ci0JCQkgICAgICBpZiggY2hpbGQuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFICkKLQkJCSAgICAgIHsKLQkJCSAgICAKLQkJCSAgICAgICAgLy9XZSBoYXZlIHBlcm1pc3Npb24gdG8gb3ZlcndyaXRlIHNvIGNoZWNrIGlmIGZpbGUgaXMgcmVhZC1vbmx5Ci0JCQkgICAgICAgIGlmKGNoaWxkLmdldFJlc291cmNlQXR0cmlidXRlcygpIT1udWxsICYmIAotCQkJICAgICAgICAJCQkJCQljaGlsZC5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKS5pc1JlYWRPbmx5KCkgKQotCQkJICAgICAgICB7Ci0JCQkgICAgICAgICAgSUZpbGVbXSBmaWxlcyA9IG5ldyBJRmlsZVsxXTsKLQkJCSAgICAgICAgICBmaWxlc1swXSA9IChJRmlsZSljaGlsZDsKLQkJCSAgICAgICAgfQotCi0JCQkgICAgICAgIC8vQ2hhbmdlIHRoZSBjb250ZW50cyBvZiB0aGUgZXhpc3RpbmcgZmlsZS4KLQkJCSAgICAgICAgSUZpbGUgZmlsZSA9IHBhcmVudC5nZXRGaWxlKCBuZXcgUGF0aChmaWxlTmFtZSkgKTsKLQkJCSAgICAgICAgZmlsZS5zZXRDb250ZW50cyggaW5wdXRTdHJlYW0sIHRydWUsIHRydWUsIG51bGwgKTsKLQkJCSAgICAgICAgCi0JCQkgICAgICAgIHJldHVybiBmaWxlOwotCQkJICAgICAgCi0JCQkgICAgICB9Ci0JCQkgICAgICBlbHNlCi0JCQkgICAgICB7Ci0JCQkgICAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKCAKLQkJCSAgICAgICAgICBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLAotCQkJICAgICAgICAgICAgICAgICAgICAgICJSZXNvdXJjZVV0aWxzIiwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAwLCAKLQkJCSAgICAgICAgICAgICAgICAgICAgICBOTFMuYmluZCgiRVJST1IiLAotCQkJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtwYXJlbnQuZ2V0RnVsbFBhdGgoKS5hcHBlbmQoZmlsZU5hbWUpfSksCi0JCQkJCQkJCSAgbnVsbCApICk7Ci0JCQkgICAgICB9Ci0JCQkgICAgfQotCQkJICAgIGVsc2UKLQkJCSAgICB7Ci0JCQkgICAgICAvL0NyZWF0ZSBhIG5ldyBmaWxlLgotCQkJICAgICAgSUZpbGUgZmlsZSA9IHBhcmVudC5nZXRGaWxlKCBuZXcgUGF0aChmaWxlTmFtZSkgKTsKLQkJCSAgICAgIGZpbGUuY3JlYXRlKCBpbnB1dFN0cmVhbSwgdHJ1ZSwgbnVsbCk7Ci0JCQkgICAgICAKLQkJCSAgICAgIHJldHVybiBmaWxlOwotCQkJICAgIH0KLQkJCSAgfQotCSAgCi0JICBwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlICgpCi0JICB7Ci0JICAgIGlmICh3b3Jrc3BhY2VfID09IG51bGwpCi0JICAgIHsKLQkgICAgICBpZiAocm9vdF8gPT0gbnVsbCkKLQkgICAgICB7Ci0JICAgICAgICByb290XyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JICAgICAgfQotCSAgICAgIAotCSAgICAgIHdvcmtzcGFjZV8gPSByb290Xy5nZXRXb3Jrc3BhY2UoKTsKLQkgICAgfQotCSAgICAKLQkgICAgcmV0dXJuIHdvcmtzcGFjZV87Ci0JICB9Ci0JICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0ZTg2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjFlNjNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYnVpbGQueG1sCi1qYXZhQ29tcGlsZXIuLi5hcmdzCi1AZG90Ci1vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZV8xLjAuMTAyLjIwMDgwNDAyMDIwNC5qYXIKLXRlbXAuZm9sZGVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFjMGQ2NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM1NTJhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLSNTdW4gTWF5IDA2IDE3OjMzOjM4IExLVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzIyYmI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI1dlZCBGZWIgMjEgMTA6NDk6MDYgTEtUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdAotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMTc3YTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVQTFVHSU5fTkFNRQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMTA2LnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUucGx1Z2luLldlYlNlcnZpY2VBeGlzMkNyZWF0aW9uQ29yZVBsdWdpbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MsCi0gb3JnLmVjbGlwc2Uud3N0LndzLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWksCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmluZm9wb3AsCi0gb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcywKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LAotIG9yZy5lY2xpcHNlLmpzdC53cywKLSBvcmcuZWNsaXBzZS5qZHQuY29yZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZSwKLSBvcmcuYXBhY2hlLmFudAotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUuY29tbWFuZCwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS5tZXNzYWdlcywKLSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS5wbHVnaW4sCi0gb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUudXRpbHMKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotQnVuZGxlLVZlbmRvcjogJVBMVUdJTl9QUk9WSURFUgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzk5YmRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDhlZDlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotIyAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyAyMDA3MDUwNyAgIDE4NTY4NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYWFlYTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotIyAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyAyMDA3MDQyOCAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSAKLSMgCQkJCQkJCQkJCSBBeGlzMiBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotIyAyMDA3MDUwMSAgIDE4NDYxNyBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBQcm92aWRlIHBsdWdpbiBkZXRhaWxzCi0jIDIwMDcwNTA3ICAgMTg1Njg2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSMgMjAwODA1MzAgICAyMzQ4NDEga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4sIENoYW5nZSBwbHVnaW4gcHJvdmlkZXIgdG8gRWNsaXBzZS5vcmcKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBNZXNzYWdlcyBpbiBwbHVnaW4ueG1sLgotIwotUExVR0lOX05BTUU9V2Vic2VydmljZSBBeGlzMiBDcmVhdGlvbiBDb3JlIFBsdWctaW4KLVBMVUdJTl9QUk9WSURFUj1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvY29tbWFuZC9BeGlzMkJVQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvY29tbWFuZC9BeGlzMkJVQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDVmZmUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL2NvbW1hbmQvQXhpczJCVUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDExMCAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLmNvbW1hbmQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUuZGF0YS5EYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUubWVzc2FnZXMuQXhpczJDcmVhdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci0KLQotcHVibGljIGNsYXNzIEF4aXMyQlVDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gCi17Ci0gIHByaXZhdGUgRGF0YU1vZGVsIG1vZGVsOwotICAKLSAgcHVibGljIEF4aXMyQlVDb21tYW5kKCBEYXRhTW9kZWwgbW9kZWwgKQotICB7Ci0gICAgdGhpcy5tb2RlbCA9IG1vZGVsOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhZGFwdGFibGUgKSAKLSAgewotICAgIElTdGF0dXMgc3RhdHVzIDsgIAotICAgIC8vIENoZWNrIGZvciB0aGUgbmVzc2VzYXJ5IGRhdGEgYXJlIGF2YWlsYWJsZSBmb3IgdGhlIHNjZW5hcmlvIHRvIGJlZ2luCi0gICAgaWYgKG1vZGVsLmdldFNlcnZpY2VDbGFzcygpID09IG51bGwpewotCQlzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyhBeGlzMkNyZWF0aW9uVUlNZXNzYWdlcy5FUlJPUl9JTlZBTElEX1NFUlZJQ0VfQ1JFQVRJT04pOwotICAgIH1lbHNlIHsKLQkJc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsgLy8gT2sgdG8gcHJvY2VlZCAKLQl9Ci0gICAgcmV0dXJuIHN0YXR1czsgICAgICAJCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL2NvbW1hbmQvQXhpczJCVVNlcnZpY2VDcmVhdGlvbkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL2NvbW1hbmQvQXhpczJCVVNlcnZpY2VDcmVhdGlvbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNlZTM5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY3JlYXRpb24vY29yZS9jb21tYW5kL0F4aXMyQlVTZXJ2aWNlQ3JlYXRpb25Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMTEwICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIHJ1bnRpbWUgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzYyCi0gKiAyMDA3MDQyNiAgIDE4MzA0NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKiAyMDA3MDYyNSAgIDE5MjUyMiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBmaXggdGhlIGJ1aWxkIHBhdGggcHJvYmxlbQotICogMjAwNzA4MTMgICAxOTYxNzMgIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEZpeCAxOTYxNzMsIERXUCBjdXN0b20gbG9jYXRpb24gZml4Ci0gKiAyMDA3MDgyNCAgIDIwMDUxNSBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBOT04tTkxTIG1vdmUgdG8gc2VwZXJhdGUgZmlsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb25zdGFudC5BeGlzMkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS51dGlscy5GYWNldENvbnRhaW5lclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLnV0aWxzLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS5kYXRhLkRhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS5tZXNzYWdlcy5BeGlzMkNyZWF0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS51dGlscy5Db21tb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS51dGlscy5TZXJ2aWNlWE1MQ3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JV2ViU2VydmljZTsKLQotcHVibGljIGNsYXNzIEF4aXMyQlVTZXJ2aWNlQ3JlYXRpb25Db21tYW5kIGV4dGVuZHMKLQkJQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gewotCQotCSAgCXByaXZhdGUgRGF0YU1vZGVsIG1vZGVsOwotCQlwcml2YXRlIElXZWJTZXJ2aWNlIHdzOwotCQlwcml2YXRlIFN0cmluZyBwcm9qZWN0OwotCi0JICBwdWJsaWMgQXhpczJCVVNlcnZpY2VDcmVhdGlvbkNvbW1hbmQoIERhdGFNb2RlbCBtb2RlbCxJV2ViU2VydmljZSB3cywgU3RyaW5nIHByb2plY3QgKQotCSAgewotCSAgICB0aGlzLm1vZGVsID0gbW9kZWw7ICAKLQkgICAgdGhpcy53cz13czsKLQkgICAgdGhpcy5wcm9qZWN0PSBwcm9qZWN0OwotCSAgfQotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykKLQkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7ICAKLQkJSUVudmlyb25tZW50IGVudmlyb25tZW50ID0gZ2V0RW52aXJvbm1lbnQoKTsKLQkJLy9UaGUgZnVsbCBRdWxhbGlmaWVkIFNlcnZpY2UgQ2xhc3MKLQkJU3RyaW5nIHNlcnZpY2VDbGFzcyA9IHdzLmdldFdlYlNlcnZpY2VJbmZvKCkuZ2V0SW1wbFVSTCgpOyAKLQkJdHJ5IHsKLQkJCQotCQkJU3RyaW5nIHdvcmtzcGFjZURpcmVjdG9yeSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKQotCQkJCQkJCQkJCQkJCQkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCQkJU3RyaW5nIG1hdGFkYXRhRGlyID0gRmlsZVV0aWxzLmFkZEFub3RoZXJOb2RlVG9QYXRoKHdvcmtzcGFjZURpcmVjdG9yeSwKLQkJCQkJQXhpczJDb25zdGFudHMuRElSX0RPVF9NRVRBREFUQSk7Ci0JCSAgICBTdHJpbmcgbWF0YWRhdGFQbHVnaW5zRGlyID0gRmlsZVV0aWxzLmFkZEFub3RoZXJOb2RlVG9QYXRoKG1hdGFkYXRhRGlyLAotCQkgICAgCQlBeGlzMkNvbnN0YW50cy5ESVJfRE9UX1BMVUdJTlMpOwotCQkgICAgU3RyaW5nIG1hdGFkYXRhQXhpczJEaXIgPSBGaWxlVXRpbHMuYWRkQW5vdGhlck5vZGVUb1BhdGgobWF0YWRhdGFQbHVnaW5zRGlyLCAKLQkJICAgIAkJQXhpczJDb25zdGFudHMuQVhJUzJfUFJPSkVDVCk7Ci0JCSAgICBTdHJpbmcgd2Vic2VydmljZXNEaXIgPSBGaWxlVXRpbHMuYWRkQW5vdGhlck5vZGVUb1BhdGgobWF0YWRhdGFBeGlzMkRpciwKLQkJICAgIAkJQXhpczJDb25zdGFudHMuRElSX1dFQlNFUlZJQ0VTKTsKLQkJICAgIG1vZGVsLnNldFBhdGhUb1dlYlNlcnZpY2VzVGVtcERpcih3ZWJzZXJ2aWNlc0Rpcik7Ci0JCSAgICAKLQkJCS8vR2V0IHRoZSBTZXJ2aWNlIG5hbWUgZnJvbSB0aGUgY2xhc3MgbmFtZQotCQkgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gQ29tbW9uVXRpbHMuY2xhc3NOYW1lRnJvbVF1YWxpZmllZE5hbWUoc2VydmljZUNsYXNzKTsgCi0JCSAgICAvL1N0cmluZyBzZXJ2aWNlUGFja2FnZSA9IENvbW1vblV0aWxzLnBhY2thZ2VOYW1lRnJvbVF1YWxpZmllZE5hbWUoc2VydmljZUNsYXNzKTsgCi0JCQkKLQkJCVN0cmluZyBzZXJ2aWNlc0RpcmVjdG9yeSA9IEZpbGVVdGlscy5hZGRBbm90aGVyTm9kZVRvUGF0aCh3ZWJzZXJ2aWNlc0Rpciwgc2VydmljZU5hbWUpOwotCQkJU3RyaW5nIHNlcnZpY2VYTUxEaXJlY3RvcnkgPSBGaWxlVXRpbHMuYWRkQW5vdGhlck5vZGVUb1BhdGgoc2VydmljZXNEaXJlY3RvcnksIAotCQkJCQlBeGlzMkNvbnN0YW50cy5ESVJfTUVUQV9JTkYpOwotCQkJCi0JCQkvL0NyZWF0ZSB0aGUgZGlyZWN0b3JpZXMKLQkJCS8vQ3JlYXRlIHRoZSBXZWJzZXJ2aWNlcyBzdHVmZiBvbiB0aGUgd29ya3NwYWNlIC5tYXRhZGF0YSBkaXJlY3RvcnkgIAotCQkgICAgRmlsZVV0aWxzLmNyZWF0ZURpcmVjdG9yeXMoc2VydmljZXNEaXJlY3RvcnkpOwotCQkgICAgRmlsZVV0aWxzLmNyZWF0ZURpcmVjdG9yeXMoc2VydmljZVhNTERpcmVjdG9yeSk7CQkgICAgCi0JCSAgICAKLQkJICAgIC8vY3JlYXRlIHRoZSBzZXJ2aWNlcy54bWwgZmlsZQotCQkgICAgRmlsZSBzZXJ2aWNlWE1MRmlsZTsKLSAgICAgICAgICAgIGlmIChtb2RlbC5pc0dlbmVyYXRlU2VydmljZXNYTUwoKSl7Ci0JCQkgICAgU2VydmljZVhNTENyZWF0b3Igc2VydmljZVhNTENyZWF0b3IgPSBuZXcgU2VydmljZVhNTENyZWF0b3Ioc2VydmljZU5hbWUsIAotCQkJICAgIAkJCQkJCQkJCQkJCQkJCXNlcnZpY2VDbGFzcywgCQotCQkJICAgIAkJCQkJCQkJCQkJCQkJCW51bGwpOwotCQkJICAgIHNlcnZpY2VYTUxGaWxlID0gbmV3IEZpbGUoc2VydmljZVhNTERpcmVjdG9yeSArIEZpbGUuc2VwYXJhdG9yICsgCi0JCQkgICAgCQlBeGlzMkNvbnN0YW50cy5GSUxFX1NFUlZJQ0VTX1hNTCk7Ci0JCQkgICAgRmlsZVdyaXRlciBzZXJ2aWNlWE1MRmlsZVdyaXRlcjsKLQkKLQkJCQlzZXJ2aWNlWE1MRmlsZVdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKHNlcnZpY2VYTUxGaWxlLCBmYWxzZSk7Ci0JICAgICAgICAgICAgQnVmZmVyZWRXcml0ZXIgd3JpdGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKHNlcnZpY2VYTUxGaWxlV3JpdGVyKSA7Ci0JICAgICAgICAgICAgd3JpdGVyLndyaXRlKHNlcnZpY2VYTUxDcmVhdG9yLnRvU3RyaW5nKCkpIDsKLQkgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKSA7Ci0gICAgICAgICAgICB9ZWxzZSB7Ci0gICAgICAgICAgICAJU3RyaW5nIHBhdGhUb1NlcnZpY2VzWE1MID0gbW9kZWwuZ2V0UGF0aFRvU2VydmljZXNYTUwoKTsKLSAgICAgICAgICAgIAlpZiAocGF0aFRvU2VydmljZXNYTUwgPT0gbnVsbCl7Ci0gICAgCQkJCXN0YXR1cyA9IFN0YXR1c1V0aWxzCi0gICAgCQkJCQkuZXJyb3JTdGF0dXMoQXhpczJDcmVhdGlvblVJTWVzc2FnZXMuRVJST1JfSU5WQUxJRF9TRVJWSUNFU19YTUwpOwotICAgIAkJCQllbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsgCi0gICAgICAgICAgICAJfWVsc2V7Ci0gICAgICAgICAgICAJCXNlcnZpY2VYTUxGaWxlID0gbmV3IEZpbGUocGF0aFRvU2VydmljZXNYTUwpOwotICAgICAgICAgICAgCQlGaWxlIHRhcmdldFNlcnZpY2VzWE1MRmlsZSA9IG5ldyBGaWxlKHNlcnZpY2VYTUxEaXJlY3RvcnkgKyBGaWxlLnNlcGFyYXRvciArIAotICAgICAgICAgICAgCQkJCUF4aXMyQ29uc3RhbnRzLkZJTEVfU0VSVklDRVNfWE1MKTsKLSAgICAgICAgICAgIAkJRmlsZVV0aWxzLmNvcHkoc2VydmljZVhNTEZpbGUsIHRhcmdldFNlcnZpY2VzWE1MRmlsZSk7Ci0gICAgICAgICAgICAJfQotICAgICAgICAgICAgCQotICAgICAgICAgICAgfQotCSAgICAgICAgCi0gICAgICAgICAgICAvL0NvcHkgdGhlIGNsYXNzZXMgZGlyZWN0b3J5IHRvIHRoZSBzZXZpY2VzIGRpcmVjdG9yeQotICAgICAgICAgICAgU3RyaW5nIGNsYXNzZXNEaXJlY3RvcnkgPSBudWxsOwotICAgIAkJSVBhdGggcHJvamVjdFJvb3QgPSBGYWNldENvbnRhaW5lclV0aWxzLmdldFByb2plY3RSb290KHByb2plY3QpOwotICAgIAkJSVBhdGggZGVmYXVsdENsYXNzZXNTdWJEaXJlY3RvcnkgPSBSZXNvdXJjZVV0aWxzLmdldEphdmFPdXRwdXRMb2NhdGlvbigKLSAgICAgICAgICAgIAkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3QpKTsKLSAgICAJCUlQYXRoIGRlZmF1bHRDbGFzc2VzU3ViRGlyZWN0b3J5V2l0aG91dFByb2plY3RSb290ID0gUmVzb3VyY2VVdGlscy5nZXRKYXZhT3V0cHV0TG9jYXRpb24oCi0gICAgICAgICAgICAJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0KSkKLSAgICAgICAgICAgIAkJLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkubWFrZUFic29sdXRlKCk7Ci0gICAgCQlpZihwcm9qZWN0Um9vdC50b09TU3RyaW5nKCkuY29udGFpbnMoRmFjZXRDb250YWluZXJVdGlscy5nZXRXb3Jrc3BhY2UoKS50b09TU3RyaW5nKCkpKXsKLSAgICAJCQljbGFzc2VzRGlyZWN0b3J5ID0gRmFjZXRDb250YWluZXJVdGlscy5nZXRXb3Jrc3BhY2UoKQotICAgIAkJCQkJCS5hcHBlbmQoZGVmYXVsdENsYXNzZXNTdWJEaXJlY3RvcnkpLnRvT1NTdHJpbmcoKTsKLSAgICAJCX1lbHNlewotICAgIAkJCWNsYXNzZXNEaXJlY3RvcnkgPSBwcm9qZWN0Um9vdAotICAgIAkJCQkJCS5hcHBlbmQoZGVmYXVsdENsYXNzZXNTdWJEaXJlY3RvcnlXaXRob3V0UHJvamVjdFJvb3QpLnRvT1NTdHJpbmcoKTsKLSAgICAJCX0KLSAgICAJCQotICAgICAgICAgICAgLy9UT0RPIGNvcHkgb25seSB0aGUgcmVsZXZlbnQgLmNsYXNzZXMgdG8gdGhlIGFhcgotCQkJRmlsZVV0aWxzLmNvcHlEaXJlY3RvcnkobmV3IEZpbGUoY2xhc3Nlc0RpcmVjdG9yeSksCi0JCQkJCQkJCQluZXcgRmlsZShzZXJ2aWNlc0RpcmVjdG9yeSkpOwotCQkJCi0vLwkJCS8vQ3JlYXRlIHRoZSAuYWFyIGZpbGUgCi0vLwkJCVN0cmluZyBhYXJEaXJTdHJpbmcgPSAgRmlsZVV0aWxzLmFkZEFub3RoZXJOb2RlVG9QYXRoKHdlYnNlcnZpY2VzRGlyLCAKLS8vCQkJQXhpczJDcmVhdGlvblVJTWVzc2FnZXMuRElSX0FBUik7Ci0vLwkJCUZpbGUgYWFyRGlyID0gbmV3IEZpbGUoYWFyRGlyU3RyaW5nKTsKLS8vCQkJRmlsZVV0aWxzLmNyZWF0ZURpcmVjdG9yeXMoYWFyRGlyU3RyaW5nKTsKLS8vCQkJQUFSRmlsZVdyaXRlciBhYXJGaWxlV3JpdGVyID0gbmV3IEFBUkZpbGVXcml0ZXIoKTsKLS8vCQkJRmlsZSBzZXJ2aXNlRGlyID0gbmV3IEZpbGUoc2VydmljZXNEaXJlY3RvcnkpOwotLy8JCQlhYXJGaWxlV3JpdGVyLndyaXRlQUFSRmlsZShhYXJEaXIsIHNlcnZpY2VOYW1lICsgCi0vLwkJCUF4aXMyQ3JlYXRpb25VSU1lc3NhZ2VzLkZJTEVfQUFSLCBzZXJ2aXNlRGlyKTsKLQkJCQotCQkJLy9JbXBvcnQgYWxsIHRoZSBzdHVmZiBmb3JtIHRoZSAubWF0YWRhdGEgZGlyZWN0b3J5IHRvIGluc2lkZSB0aGUgY3VycmVudCB3ZWIgcHJvamVjdAotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCXN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKAotCQkJCQkJTkxTLmJpbmQoQXhpczJDcmVhdGlvblVJTWVzc2FnZXMuRVJST1JfSU5WQUxJRF9GSUxFX1JFQURfV1JJVEVMLAotCQkJCQkJCQluZXcgU3RyaW5nW117ZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCl9KSwgZSk7Ci0JCQkJZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7IAotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cygKLQkJCQkJCU5MUy5iaW5kKEF4aXMyQ3JlYXRpb25VSU1lc3NhZ2VzLkVSUk9SX0lOVkFMSURfU0VSVklDRV9DUkVBVElPTiwKLQkJCQkJCQkJbmV3IFN0cmluZ1tde2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIGUpOwotCQkJCWVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOyAKLQkJCX0KLQkJICAgIAotCQkKLQkgICAgCi0JICAgIHJldHVybiBzdGF0dXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvY29tbWFuZC9BeGlzMkJ1aWxkUHJvamVjdENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL2NvbW1hbmQvQXhpczJCdWlsZFByb2plY3RDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNmRjY2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvY29tbWFuZC9BeGlzMkJ1aWxkUHJvamVjdENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAxMTAgICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgQXhpczIgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSAqIDIwMDcwNDI2ICAgMTgzMDQ2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSAqIDIwMDcwNTA3ICAgMTg1Njg2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS5jb21tYW5kOwotCi0vL2ltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLnZhbGlkYXRpb24uVmFsaWRhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBBeGlzMkJ1aWxkUHJvamVjdENvbW1hbmQgZXh0ZW5kcwotCQlBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0JCi0vLwkgIHByaXZhdGUgVmFsaWRhdGlvbk1hbmFnZXIgdmFsaWRhdGlvbk1hbmFnZXI7Ci0JICBwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0JICBwcml2YXRlIGJvb2xlYW4gZm9yY2VCdWlsZDsKLQotCSAgLyoqCi0JICAgKiBEZWZhdWx0IENUT1I7Ci0JICAgKi8KLQkgIHB1YmxpYyBBeGlzMkJ1aWxkUHJvamVjdENvbW1hbmQoKXsKLQkgIH0KLQkgIAotCSAgcHVibGljIEF4aXMyQnVpbGRQcm9qZWN0Q29tbWFuZChJUHJvamVjdCBwcm9qZWN0KXsKLQkJICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCSAgfQotCSAgCi0JICBwdWJsaWMgQXhpczJCdWlsZFByb2plY3RDb21tYW5kKElQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gZm9yY2VCdWlsZCl7Ci0JCSAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQkJICB0aGlzLmZvcmNlQnVpbGQgPSBmb3JjZUJ1aWxkOwotCSAgfQotCi0JICAvKioKLQkgICAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQKLQkgICAqLwotCSAgcHVibGljIElTdGF0dXMgZXhlY3V0ZSggSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGFkYXB0YWJsZSApCi0JICB7Ci0JICAgIHRyeQotCSAgICB7Ci0JICAgICAgaWYgKGZvcmNlQnVpbGQpCi0JICAgICAgICBwcm9qZWN0LmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuSU5DUkVNRU5UQUxfQlVJTEQsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotLy8JICAgICAgZWxzZSBpZiAodmFsaWRhdGlvbk1hbmFnZXIgPT0gbnVsbCkKLS8vCSAgICAgICAgcHJvamVjdC5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLklOQ1JFTUVOVEFMX0JVSUxELCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLS8vCSAgICAgIGVsc2UgaWYgKHZhbGlkYXRpb25NYW5hZ2VyLmdldFdvcmtzcGFjZUF1dG9CdWlsZFByZWZlcmVuY2UoKSkKLS8vCSAgICAgICAgcHJvamVjdC5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLklOQ1JFTUVOVEFMX0JVSUxELCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkgICAgfQotCSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpewotCSAgICB9Ci0JICAgIAotCSAgICB0cnl7Ci0JICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELAotICAJCSAgCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsgICAKLQkgICAgfQotCSAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpewotCSAgICAgIC8vIGNvbnRpbnVlIGV4ZWN1dGlvbgotCSAgICB9Ci0JICAgIGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpewotCSAgICAgIC8vIGNvbnRpbnVlIGV4ZWN1dGlvbgotCSAgICB9Ci0JICAgIAotCSAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkgIH0KLQkgIC8qKgotCSAgICogQHBhcmFtIGZvcmNlQnVpbGQgVGhlIGZvcmNlQnVpbGQgdG8gc2V0LgotCSAgICovCi0JICBwdWJsaWMgdm9pZCBzZXRGb3JjZUJ1aWxkKGJvb2xlYW4gZm9yY2VCdWlsZCkgewotCSAgICB0aGlzLmZvcmNlQnVpbGQgPSBmb3JjZUJ1aWxkOwotCSAgfQotCi0JICAvKioKLQkgICAqIEBwYXJhbSBwcm9qZWN0IFRoZSBwcm9qZWN0IHRvIHNldC4KLQkgICAqLwotCSAgcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0JICB9Ci0KLS8vCSAgLyoqCi0vLwkgICAqIEBwYXJhbSB2YWxpZGF0aW9uTWFuYWdlciBUaGUgdmFsaWRhdGlvbk1hbmFnZXIgdG8gc2V0LgotLy8JICAgKi8KLS8vCSAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvbk1hbmFnZXIoVmFsaWRhdGlvbk1hbmFnZXIgdmFsaWRhdGlvbk1hbmFnZXIpIHsKLS8vCSAgICB0aGlzLnZhbGlkYXRpb25NYW5hZ2VyID0gdmFsaWRhdGlvbk1hbmFnZXI7Ci0vLwkgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvY29tbWFuZC9BeGlzMkNoZW5nZUJ1aWxkUGF0aENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL2NvbW1hbmQvQXhpczJDaGVuZ2VCdWlsZFBhdGhDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmYjU0MGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvY29tbWFuZC9BeGlzMkNoZW5nZUJ1aWxkUGF0aENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDEyNSAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIAotICogCQkJCQkJCQkJCSAgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIEF4aXMyQ2hlbmdlQnVpbGRQYXRoQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLQkKLQlwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0JcHJpdmF0ZSBTdHJpbmcgc3JjRGlyOwotCXByaXZhdGUgU3RyaW5nIG91dERpcjsKLQkKLQlwdWJsaWMgQXhpczJDaGVuZ2VCdWlsZFBhdGhDb21tYW5kKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBzcmNEaXIsIFN0cmluZyBvdXREaXIpIHsKLQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQkJdGhpcy5zcmNEaXIgPSBzcmNEaXI7Ci0JCXRoaXMub3V0RGlyID0gb3V0RGlyOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pCi0JCQkJICAgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQotCQlJUGF0aCBzcmNQYXRoID0gbmV3IFBhdGgoc3JjRGlyKTsKLQkJSVBhdGggb3V0UGF0aCA9IG5ldyBQYXRoKG91dERpcik7Ci0JCQotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCWZpbmFsIElKYXZhUHJvamVjdCBqcHJvaiA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLSAgICAgICAgZmluYWwgSUNsYXNzcGF0aEVudHJ5W10gY3AgPSB7SmF2YUNvcmUubmV3U291cmNlRW50cnkoc3JjUGF0aCl9OwotCi0gICAgICAgIHRyeSB7Ci0JCQlqcHJvai5zZXRSYXdDbGFzc3BhdGgoY3AsIG91dFBhdGgsIG51bGwpOwotCQkJanByb2ouc2F2ZShudWxsLCB0cnVlKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL2NvbW1hbmQvQXhpczJDbGVhbnVwQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvY29tbWFuZC9BeGlzMkNsZWFudXBDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YmI4MmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvY29tbWFuZC9BeGlzMkNsZWFudXBDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAzMTQgICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSAKLSAqIAkJCQkJCQkJCQl0aGUgQXhpczIgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS5jb21tYW5kOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci0KLQotcHVibGljIGNsYXNzIEF4aXMyQ2xlYW51cENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiAKLXsKLSAgCi0gIHB1YmxpYyBBeGlzMkNsZWFudXBDb21tYW5kKCl7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhZGFwdGFibGUgKSAKLSAgewotICAgIC8vIENsZWFudXAgdGhlIHJlZmxlY3Rpb24gb3ZlciBoZWFkIGJ5IGluY3JlYXNpbmcgdGhlIHByaW9yaXR5IHRvIHRoZSBnYXJiYWdlIHRocmVhZAotICAgIFN5c3RlbS5nYygpOwotICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOyAgICAgIAkKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvY29tbWFuZC9BeGlzMkRlZmF1bHRpbmdDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY3JlYXRpb24vY29yZS9jb21tYW5kL0F4aXMyRGVmYXVsdGluZ0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZkNWIyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY3JlYXRpb24vY29yZS9jb21tYW5kL0F4aXMyRGVmYXVsdGluZ0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAyMDYgICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgQXhpczIgCi0gKiAJCQkJCQkJCQkJICBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotICogMjAwNzA1MDggICAxNzUwMzAgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgV1NETCBub3QgcGFzc2VkIHRvIEF4aXMyIGNsaWVudCBmaXgKLSAqIDIwMDcwNjEyICAgMTkyMDQ3IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIDE5MjA0NwotICogMjAwNzA4MjQgICAyMDA1MTUgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgTk9OLU5MUyBtb3ZlIHRvIHNlcGVyYXRlIGZpbGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS5jb21tYW5kOwotCi1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLnV0aWxzLkRlZmF1bHRDb2RlZ2VuVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb25zdGFudC5BeGlzMkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLnBsdWdpbi5tZXNzYWdlcy5BeGlzMkNvcmVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLnV0aWxzLkF4aXMyQ29yZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLnV0aWxzLkZhY2V0Q29udGFpbmVyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUuZGF0YS5EYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUudXRpbHMuQ29tbW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuSVdlYlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuV2ViU2VydmljZVNjZW5hcmlvOwotCi1wdWJsaWMgY2xhc3MgQXhpczJEZWZhdWx0aW5nQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIAotewotCXByaXZhdGUgRGF0YU1vZGVsIG1vZGVsOwotCXByaXZhdGUgSVdlYlNlcnZpY2Ugd3M7Ci0JcHJpdmF0ZSBpbnQgc2NlbmFyaW87Ci0JSVN0YXR1cyBzdGF0dXM7Ci0KLQlwdWJsaWMgQXhpczJEZWZhdWx0aW5nQ29tbWFuZCggRGF0YU1vZGVsIG1vZGVsICxJV2ViU2VydmljZSB3cywgaW50IHNjZW5hcmlvKQotCXsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOyAgCi0JCXRoaXMud3M9d3M7Ci0JCXRoaXMuc2NlbmFyaW89c2NlbmFyaW87Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZSggSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGFkYXB0YWJsZSApewotCQkvL0NoZWNrIHdldGhlciB0aGUgY3VycmVudCBkeW5hbWljIFdlYiBQcm9qZWN0IGlzIHByb3Blcmx5IGJ1aWxkIHRvIGludm9rZSB3ZWIgc2VydmljZQotCQlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotCQl0cnkgewotCQkJcHJvcGVydGllcy5sb2FkKG5ldyBGaWxlSW5wdXRTdHJlYW0oQXhpczJDb3JlVXRpbHMudGVtcFJ1bnRpbWVTdGF0dXNGaWxlTG9jYXRpb24oKSkpOwotCQkJaWYgKHByb3BlcnRpZXMuY29udGFpbnNLZXkoQXhpczJDb25zdGFudHMuUFJPUEVSVFlfS0VZX1NUQVRVUykpewotCQkJCSBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCSBtb2RlbC5zZXRTZXJ2ZXJTdGF0dXModHJ1ZSk7Ci0JCQl9ZWxzZXsKLQkJCQlzdGF0dXMgPSBTdGF0dXNVdGlscy5lcnJvclN0YXR1cyhBeGlzMkNvcmVVSU1lc3NhZ2VzLkVSUk9SX1NFUlZFUl9JU19OT1RfU0VUKTsKLQkJCX0KLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCXN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKEF4aXMyQ29yZVVJTWVzc2FnZXMuRVJST1JfSU5WQUxJRF9GSUxFX1JFQURfV1JJVEVMKwotCQkJCQkJCQkJCQkJQXhpczJDb3JlVUlNZXNzYWdlcy5FUlJPUl9TRVJWRVJfSVNfTk9UX1NFVCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKEF4aXMyQ29yZVVJTWVzc2FnZXMuRVJST1JfSU5WQUxJRF9GSUxFX1JFQURfV1JJVEVMKwotCQkJCQkJCQkJCQkJQXhpczJDb3JlVUlNZXNzYWdlcy5FUlJPUl9TRVJWRVJfSVNfTk9UX1NFVCk7Ci0JCX0KLQkJCi0JCWlmIChzY2VuYXJpbyA9PSBXZWJTZXJ2aWNlU2NlbmFyaW8uVE9QRE9XTikgewotCQkJbW9kZWwuc2V0V3NkbFVSSSh3cy5nZXRXZWJTZXJ2aWNlSW5mbygpLmdldFdzZGxVUkwoKSk7Ci0JCQltb2RlbC5zZXREYXRhYmluZGluZ1R5cGUoQXhpczJDb25zdGFudHMuREFUQV9CSU5ESU5HX0FEQik7Ci0JCQlEZWZhdWx0Q29kZWdlblV0aWwgZGVmYXVsdENvZGVnZW5VdGlsID0gbmV3IERlZmF1bHRDb2RlZ2VuVXRpbChtb2RlbCk7Ci0JCQlkZWZhdWx0Q29kZWdlblV0aWwucG9wdWxhdGVNb2RlbFBhcmFtc0Zyb21XU0RMKCk7Ci0JCQltb2RlbC5zZXRTZXJ2aWNlc1hNTCh0cnVlKTsKLQkJCW1vZGVsLnNldFNlcnZlclhNTENoZWNrKHRydWUpOwotCQkJU2VydmljZUNvbnRleHQuZ2V0SW5zdGFuY2UoKS5zZXRTZXJ2aWNlTmFtZShtb2RlbC5nZXRTZXJ2aWNlTmFtZSgpKTsKLQkJfWVsc2UgaWYgKHNjZW5hcmlvID09IFdlYlNlcnZpY2VTY2VuYXJpby5CT1RUT01VUCkgewotCQkJbW9kZWwuc2V0U2VydmljZUNsYXNzKHdzLmdldFdlYlNlcnZpY2VJbmZvKCkuZ2V0SW1wbFVSTCgpKTsKLQkJCS8vc2V0IHRoZSBzZXJ2aWNlIG5hbWUgaW5zaWRlIEJVU2VydmljZUNvbnRleHQgZm9yIHVzZWQgYnkgY2xpZW50IGlmIGludm9rZSB0b2dldGhlcgotCQkJU2VydmljZUNvbnRleHQuZ2V0SW5zdGFuY2UoKS5zZXRTZXJ2aWNlTmFtZSgKLQkJCQkJQ29tbW9uVXRpbHMuY2xhc3NOYW1lRnJvbVF1YWxpZmllZE5hbWUod3MuZ2V0V2ViU2VydmljZUluZm8oKS5nZXRJbXBsVVJMKCkpCi0JCQkJCSk7Ci0JCQkKLQkJCW1vZGVsLnNldEdlbmVyYXRlU2VydmljZXNYTUwodHJ1ZSk7Ci0JCX1lbHNlewotCQkJLy9uZXZlciBjb21lIGhlcmUKLQkJfQotCQkKLQkJLy8gRml4IGZvciB0aGUgQnVnemlsbGEgQnVnIDE3NTAzMAotCQkvLyBBeGlzMjogV1NETCByZXByZXNlbnRpbmcgV2ViIHNlcnZpY2Ugbm90IHBhc3NlZCB0byBBeGlzMiBjbGllbnQKLQkJLy8gQWZ0ZXIgc2V0dGluZyB0aGUgaW5pdGlhbCB3c2RsVVJMIHJldHVybiBmcm9tIHRoZSBmcmFtZXdvcmsgdG8gdGhlIGRhdGEgbW9kZWwsCi0JCS8vIHJlcGxhY2UgaXQgd2l0aCB0aGUgZGVwbG95ZWQgd3NkbFVSTAotCQlTdHJpbmcgZGVwbG95ZWRXU0RMVVJMID0gRmFjZXRDb250YWluZXJVdGlscy5nZXREZXBsb3llZFdTRExVUkwoCi0JCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KG1vZGVsLmdldFdlYlByb2plY3ROYW1lKCkpLAotCQkJCXdzLmdldFdlYlNlcnZpY2VJbmZvKCkuZ2V0U2VydmVyRmFjdG9yeUlkKCksCi0JCQkJd3MuZ2V0V2ViU2VydmljZUluZm8oKS5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCksCi0JCQkJU2VydmljZUNvbnRleHQuZ2V0SW5zdGFuY2UoKS5nZXRTZXJ2aWNlTmFtZSgpKTsKLQkJCi0JCXdzLmdldFdlYlNlcnZpY2VJbmZvKCkuc2V0V3NkbFVSTChkZXBsb3llZFdTRExVUkwpOwotCQkKLQkJcmV0dXJuIHN0YXR1czsgICAgICAJCi0JfQotCi0JcHVibGljIERhdGFNb2RlbCBnZXRXZWJTZXJ2aWNlRGF0YU1vZGVsKCkKLQl7Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY3JlYXRpb24vY29yZS9jb21tYW5kL0F4aXMyU2VydmljZXNYTUxWYWxpZGF0aW9uQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvY29tbWFuZC9BeGlzMlNlcnZpY2VzWE1MVmFsaWRhdGlvbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc0ZGNlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY3JlYXRpb24vY29yZS9jb21tYW5kL0F4aXMyU2VydmljZXNYTUxWYWxpZGF0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMTEwICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIHJ1bnRpbWUgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzYyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIEF4aXMyU2VydmljZXNYTUxWYWxpZGF0aW9uQ29tbWFuZCBleHRlbmRzCi0JCUFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pCi0JCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJLy9IZXJlIHdyaXRlIHRoZSBjb2RlIHRvIHZhbGlkYXRlIHRoZSBzZXJ2aWNlcy54bWwKLQkgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOyAKLQkgICAgcmV0dXJuIHN0YXR1czsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY3JlYXRpb24vY29yZS9jb21tYW5kL0F4aXMyU2tlbEltcGxDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY3JlYXRpb24vY29yZS9jb21tYW5kL0F4aXMyU2tlbEltcGxDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMWY1NDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvY29tbWFuZC9BeGlzMlNrZWxJbXBsQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMTIzICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIAotICogCQkJCQkJCQkJCSAgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSAqIDIwMDcwNDI2ICAgMTgzMDQ2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSAqIDIwMDcwODI0ICAgMjAwNTE1IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIE5PTi1OTFMgbW92ZSB0byBzZXBlcmF0ZSBmaWxlCi0gKiAyMDA4MDkyNCAgIDI0NzkyOSBzYW1pbmRhd0B3c28yLmNvbSAtIFNhbWluZGEgV2lqZXJhdG5lLCBzb3VyY2UgZm9sZGVyIG5vdCBjb3JyZWN0bHkgc2V0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUuY29tbWFuZDsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb25zdGFudC5BeGlzMkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS51dGlscy5BeGlzMkNvcmVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS51dGlscy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUuZGF0YS5EYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUubWVzc2FnZXMuQXhpczJDcmVhdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUudXRpbHMuQ29tbW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5XZWJTZXJ2aWNlSW5mbzsKLQotcHVibGljIGNsYXNzIEF4aXMyU2tlbEltcGxDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gewotCi0JcHJpdmF0ZSBXZWJTZXJ2aWNlSW5mbyB3ZWJTZXJ2aWNlSW5mbzsKLQlwcml2YXRlIERhdGFNb2RlbCBtb2RlbDsKLQotCXB1YmxpYyBBeGlzMlNrZWxJbXBsQ29tbWFuZChXZWJTZXJ2aWNlSW5mbyB3ZWJTZXJ2aWNlSW5mbywgRGF0YU1vZGVsIG1vZGVsKXsKLQkJdGhpcy53ZWJTZXJ2aWNlSW5mbyA9IHdlYlNlcnZpY2VJbmZvOwotCQl0aGlzLm1vZGVsPW1vZGVsOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkKLQkJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQlJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBnZXRFbnZpcm9ubWVudCgpOwotCi0JCVN0cmluZyB3b3Jrc3BhY2VEaXJlY3RvcnkgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLgotCQkJCQkJCQkJCQkJCWdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCQlTdHJpbmcgY3VycmVudER5bmFtaWNXZWJQcm9qZWN0RGlyID0gRmlsZVV0aWxzLmFkZEFub3RoZXJOb2RlVG9QYXRoKAotCQkJCQkJCQkJCQkJCSAgIHdvcmtzcGFjZURpcmVjdG9yeSwgCi0JCQkJCQkJCQkJCQkJICAgbW9kZWwuZ2V0V2ViUHJvamVjdE5hbWUoKSk7Ci0JCVN0cmluZyBwcm9qZWN0U3JjRGlyID0gIEZpbGVVdGlscy5hZGRBbm90aGVyTm9kZVRvUGF0aCgKLQkJCQkJCQkJCQkJY3VycmVudER5bmFtaWNXZWJQcm9qZWN0RGlyLCAKLQkJCQkJCQkJCQkJQXhpczJDb3JlVXRpbHMuZ2V0U291cmNlRm9sZGVyKG1vZGVsLmdldFdlYlByb2plY3ROYW1lKCkpKTsKLQotCQlTdHJpbmcgcGFja2FnZVBhdGggPSBDb21tb25VdGlscy5wYWNrZ2VOYW1lMlBhdGhOYW1lKG1vZGVsLmdldFBhY2thZ2VUZXh0KCkpOwotCQlTdHJpbmcgcGFja2FnZURpciA9IEZpbGVVdGlscy5hZGRBbm90aGVyTm9kZVRvUGF0aChwcm9qZWN0U3JjRGlyLCBwYWNrYWdlUGF0aCk7Ci0JCVN0cmluZyBzZXJ2aWNlU2tlbGV0b25JbXBsID0gRmlsZVV0aWxzLmFkZEFub3RoZXJOb2RlVG9QYXRoKHBhY2thZ2VEaXIsIG1vZGVsLgotCQkJCQkJCQkJCQkJCQkJCQlnZXRTZXJ2aWNlTmFtZSgpKTsKLQotCQlTdHJpbmcgc2VydmljZVNrZWxldG9uSW1wbFVSTCA9ICBzZXJ2aWNlU2tlbGV0b25JbXBsICsgQXhpczJDb25zdGFudHMuU0tFTEVUT05fU1VGRklYOwotCQlJUGF0aCBzZXJ2aWNlU2tlbGV0b25JbXBsVVJMUGF0aCA9IG5ldyBQYXRoKHNlcnZpY2VTa2VsZXRvbkltcGxVUkwpOyAKLQkJdHJ5IHsKLQkJCS8vd2ViU2VydmljZUluZm8uc2V0SW1wbFVSTChzZXJ2aWNlU2tlbGV0b25JbXBsVVJMUGF0aC50b0ZpbGUoKS50b1VSTCgpLnRvU3RyaW5nKCkpOwotCQkJLy9TdHJpbmdbXSBpbXBsVVJMQXJyYXkgPSB7c2VydmljZVNrZWxldG9uSW1wbFVSTH07Ci0JCQkvL3dlYlNlcnZpY2VJbmZvLnNldEltcGxVUkxzKCBpbXBsVVJMQXJyYXkpOwotCQkJCi0JCQlTdHJpbmcgc2VydmljZVNrZWxldG9uSW1wbFVSTFN0cmluZyA9IAotCQkJCXNlcnZpY2VTa2VsZXRvbkltcGxVUkxQYXRoLnRvRmlsZSgpLnRvVVJMKCkudG9TdHJpbmcoKTsKLQotCQkJd2ViU2VydmljZUluZm8uc2V0SW1wbFVSTChzZXJ2aWNlU2tlbGV0b25JbXBsVVJMU3RyaW5nKTsKLQkJCVN0cmluZ1tdIGltcGxVUkxBcnJheSA9IHtzZXJ2aWNlU2tlbGV0b25JbXBsVVJMU3RyaW5nfTsKLQkJCXdlYlNlcnZpY2VJbmZvLnNldEltcGxVUkxzKCBpbXBsVVJMQXJyYXkpOwotCi0JCQkKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKAotCQkJCQlOTFMuYmluZChBeGlzMkNyZWF0aW9uVUlNZXNzYWdlcy5FUlJPUl9JTlZBTElEX0ZJTEVfUkVBRF9XUklURUwsCi0JCQkJCQkJbmV3IFN0cmluZ1tde2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIGUpOwotCQkJZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7IAotCQl9Ci0KLQkJcmV0dXJuIHN0YXR1czsKLQkJCi0JfQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvY29tbWFuZC9BeGlzMlREQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvY29tbWFuZC9BeGlzMlREQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDdlN2QwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL2NvbW1hbmQvQXhpczJURENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDExMCAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLmNvbW1hbmQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUuZGF0YS5EYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUubWVzc2FnZXMuQXhpczJDcmVhdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci0KLQotcHVibGljIGNsYXNzIEF4aXMyVERDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gCi17Ci0gIHByaXZhdGUgRGF0YU1vZGVsIG1vZGVsOwotICAKLSAgcHVibGljIEF4aXMyVERDb21tYW5kKCBEYXRhTW9kZWwgbW9kZWwgKQotICB7Ci0gICAgdGhpcy5tb2RlbCA9IG1vZGVsOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhZGFwdGFibGUgKSAKLSAgewotICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsgIAotICAgIC8vIENoZWNrIGZvciB0aGUgbmVzc2VzYXJ5IGRhdGEgYXJlIGF2YWlsYWJsZSBmb3IgdGhlIHNjZW5hcmlvIHRvIGJlZ2luCi0gICAgaWYgKG1vZGVsLmdldFdzZGxVUkkoKSA9PSBudWxsKXsKLQkJc3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoQXhpczJDcmVhdGlvblVJTWVzc2FnZXMuRVJST1JfSU5WQUxJRF9TRVJWSUNFX0NSRUFUSU9OKTsKLSAgICB9ZWxzZSB7Ci0JCXN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7IC8vIE9rIHRvIHByb2NlZWQgCi0JfQotICAgIHJldHVybiBzdGF0dXM7ICAgICAgCQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY3JlYXRpb24vY29yZS9jb21tYW5kL0F4aXMyVERTZXJ2aWNlQ3JlYXRpb25Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY3JlYXRpb24vY29yZS9jb21tYW5kL0F4aXMyVERTZXJ2aWNlQ3JlYXRpb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNGU0NzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvY29tbWFuZC9BeGlzMlREU2VydmljZUNyZWF0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDQyNiAgIDE4MzA0NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKiAyMDA3MDUwNyAgIDE4NDc0MCBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKiAyMDA3MDYyNSAgIDE5MjUyMiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBmaXggdGhlIGJ1aWxkIHBhdGggcHJvYmxlbQotICogMjAwNzA4MTMgICAxOTYxNzMgIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEZpeCAxOTYxNzMsIERXUCBjdXN0b20gbG9jYXRpb24gZml4Ci0gKiAyMDA3MDgyNCAgIDIwMDUxNSBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBOT04tTkxTIG1vdmUgdG8gc2VwZXJhdGUgZmlsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb25zdGFudC5BeGlzMkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS51dGlscy5GYWNldENvbnRhaW5lclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLnV0aWxzLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS5kYXRhLkRhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS5tZXNzYWdlcy5BeGlzMkNyZWF0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JV2ViU2VydmljZTsKLQotcHVibGljIGNsYXNzIEF4aXMyVERTZXJ2aWNlQ3JlYXRpb25Db21tYW5kIGV4dGVuZHMKLUFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLQkKLSAgCXByaXZhdGUgRGF0YU1vZGVsIG1vZGVsOwotICAJcHJpdmF0ZSBTdHJpbmcgcHJvamVjdDsKLQotICBwdWJsaWMgQXhpczJURFNlcnZpY2VDcmVhdGlvbkNvbW1hbmQoIERhdGFNb2RlbCBtb2RlbCxJV2ViU2VydmljZSB3cywgU3RyaW5nIHByb2plY3QgKSB7Ci0gICAgdGhpcy5tb2RlbCA9IG1vZGVsOyAgCi0gICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLSAgfQotCi1wdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQotCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7ICAKLQlJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBnZXRFbnZpcm9ubWVudCgpOwotCi0JdHJ5IHsKLQkJCi0JCVN0cmluZyB3b3Jrc3BhY2VEaXJlY3RvcnkgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkKLQkJCQkJCQkJCQkJCQkJLmdldFJvb3QoKS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKLQkJU3RyaW5nIGN1cnJlbnREeW5hbWljV2ViUHJvamVjdERpciA9IEZhY2V0Q29udGFpbmVyVXRpbHMuZ2V0UHJvamVjdFJvb3QoIAotCQkJCQkJCQkJCQkJCQltb2RlbC5nZXRXZWJQcm9qZWN0TmFtZSgpKS50b09TU3RyaW5nKCk7Ci0JCVN0cmluZyBtYXRhZGF0YURpciA9IEZpbGVVdGlscy5hZGRBbm90aGVyTm9kZVRvUGF0aCh3b3Jrc3BhY2VEaXJlY3RvcnksCi0JCQkJQXhpczJDb25zdGFudHMuRElSX0RPVF9NRVRBREFUQSk7Ci0JICAgIFN0cmluZyBtYXRhZGF0YVBsdWdpbnNEaXIgPSBGaWxlVXRpbHMuYWRkQW5vdGhlck5vZGVUb1BhdGgobWF0YWRhdGFEaXIsCi0JICAgIAkJQXhpczJDb25zdGFudHMuRElSX0RPVF9QTFVHSU5TKTsKLQkgICAgU3RyaW5nIG1hdGFkYXRhQXhpczJEaXIgPSBGaWxlVXRpbHMuYWRkQW5vdGhlck5vZGVUb1BhdGgobWF0YWRhdGFQbHVnaW5zRGlyLCAKLQkgICAgCQlBeGlzMkNvbnN0YW50cy5BWElTMl9QUk9KRUNUKTsKLQkgICAgU3RyaW5nIHRlbXBTZXJ2aWNlc0RpciA9IEZpbGVVdGlscy5hZGRBbm90aGVyTm9kZVRvUGF0aChtYXRhZGF0YUF4aXMyRGlyLAotCSAgICAJCUF4aXMyQ29uc3RhbnRzLkRJUl9TRVJWSUNFUyk7Ci0JICAgIAotCSAgICBtb2RlbC5zZXRQYXRoVG9XZWJTZXJ2aWNlc1RlbXBEaXIodGVtcFNlcnZpY2VzRGlyKTsKLQkJCi0JICAgIC8vRXhwbG9kZWQgdGVtcGVyb3J5IHNlcnZpY2VzIGRpcmVjdG9yeQotCQlTdHJpbmcgY3VycmVudHNlcnZpY2VzRGlyZWN0b3J5ID0gRmlsZVV0aWxzLmFkZEFub3RoZXJOb2RlVG9QYXRoKHRlbXBTZXJ2aWNlc0RpciwgCi0JCQkJCQkJCQkJCQkJCW1vZGVsLmdldFNlcnZpY2VOYW1lKCkpOwotCQlTdHJpbmcgbWV0YUluZkRpcmVjdG9yeSA9IEZpbGVVdGlscy5hZGRBbm90aGVyTm9kZVRvUGF0aChjdXJyZW50c2VydmljZXNEaXJlY3RvcnksIAotCQkJCUF4aXMyQ29uc3RhbnRzLkRJUl9NRVRBX0lORik7Ci0JCQotCQkvL0NyZWF0ZSB0aGUgZGlyZWN0b3JpZXMKLQkJLy9DcmVhdGUgdGhlIFdlYnNlcnZpY2VzIHN0dWZmIG9uIHRoZSB3b3Jrc3BhY2UgLm1hdGFkYXRhIGRpcmVjdG9yeSAgCi0JICAgIEZpbGVVdGlscy5jcmVhdGVEaXJlY3RvcnlzKGN1cnJlbnRzZXJ2aWNlc0RpcmVjdG9yeSk7Ci0JICAgIEZpbGVVdGlscy5jcmVhdGVEaXJlY3RvcnlzKG1ldGFJbmZEaXJlY3RvcnkpOwkJICAgIAotCSAgICAKLQkgICAgCi0JICAgIC8vY29weSB0aGUgZ2VuZXJhdGVkIHJlc291cmNlcyAoc2VydmljZXMueG1sIC53c2RsICkgZmlsZXMKLQkgICAgLy9hdCByZXNvdXJjZXMvc2VydmljZS54bWwKLQkgICAgU3RyaW5nIGN1cnJlbnRQcm9qZWN0UmVzb3VyY2VzRGlyU3RyaW5nID0gRmlsZVV0aWxzCi0JICAgIAkJLmFkZEFub3RoZXJOb2RlVG9QYXRoKGN1cnJlbnREeW5hbWljV2ViUHJvamVjdERpciwgCi0JICAgIAkJCQlBeGlzMkNvbnN0YW50cy5ESVJfUkVTT1VSQ0VTKTsKLQkgICAgRmlsZSBjdXJyZW50UHJvamVjdFJlc291cmNlc0RpciA9IG5ldyBGaWxlKGN1cnJlbnRQcm9qZWN0UmVzb3VyY2VzRGlyU3RyaW5nKTsKLQkgICAgaWYoIWN1cnJlbnRQcm9qZWN0UmVzb3VyY2VzRGlyLmV4aXN0cygpKXsKLQkgICAgCWN1cnJlbnRQcm9qZWN0UmVzb3VyY2VzRGlyLm1rZGlyKCk7Ci0JICAgIH0KLQkgICAgRmlsZVV0aWxzLmNvcHlEaXJlY3RvcnkoY3VycmVudFByb2plY3RSZXNvdXJjZXNEaXIsIG5ldyBGaWxlKG1ldGFJbmZEaXJlY3RvcnkpKTsKLSAgICAgICAgCi0gICAgICAgIC8vQ29weSB0aGUgY2xhc3NlcyBkaXJlY3RvcnkgdG8gdGhlIHNldmljZXMgZGlyZWN0b3J5Ci0gICAgICAgIFN0cmluZyBjbGFzc2VzRGlyZWN0b3J5ID0gbnVsbDsKLQkJSVBhdGggcHJvamVjdFJvb3QgPSBGYWNldENvbnRhaW5lclV0aWxzLmdldFByb2plY3RSb290KHByb2plY3QpOwotCQlJUGF0aCBkZWZhdWx0Q2xhc3Nlc1N1YkRpcmVjdG9yeSA9IFJlc291cmNlVXRpbHMuZ2V0SmF2YU91dHB1dExvY2F0aW9uKAotICAgICAgICAJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0KSk7Ci0JCUlQYXRoIGRlZmF1bHRDbGFzc2VzU3ViRGlyZWN0b3J5V2l0aG91dFByb2plY3RSb290ID0gUmVzb3VyY2VVdGlscy5nZXRKYXZhT3V0cHV0TG9jYXRpb24oCi0gICAgICAgIAkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3QpKQotICAgICAgICAJCS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpLm1ha2VBYnNvbHV0ZSgpOwotCQlpZihwcm9qZWN0Um9vdC50b09TU3RyaW5nKCkuY29udGFpbnMoRmFjZXRDb250YWluZXJVdGlscy5nZXRXb3Jrc3BhY2UoKS50b09TU3RyaW5nKCkpKXsKLQkJCWNsYXNzZXNEaXJlY3RvcnkgPSBGYWNldENvbnRhaW5lclV0aWxzLmdldFdvcmtzcGFjZSgpCi0JCQkJCQkuYXBwZW5kKGRlZmF1bHRDbGFzc2VzU3ViRGlyZWN0b3J5KS50b09TU3RyaW5nKCk7Ci0JCX1lbHNlewotCQkJY2xhc3Nlc0RpcmVjdG9yeSA9IHByb2plY3RSb290Ci0JCQkJCQkuYXBwZW5kKGRlZmF1bHRDbGFzc2VzU3ViRGlyZWN0b3J5V2l0aG91dFByb2plY3RSb290KS50b09TU3RyaW5nKCk7Ci0JCX0KLQkJCi0gICAgICAgIC8vVE9ETyBjb3B5IG9ubHkgdGhlIHJlbGV2ZW50IC5jbGFzc2VzIHRvIHRoZSBhYXIKLQkJRmlsZVV0aWxzLmNvcHlEaXJlY3RvcnkobmV3IEZpbGUoY2xhc3Nlc0RpcmVjdG9yeSksCi0JCQkJCQkJCW5ldyBGaWxlKGN1cnJlbnRzZXJ2aWNlc0RpcmVjdG9yeSkpOwotCQkKLS8vCQkvL0NyZWF0ZSB0aGUgLmFhciBmaWxlIAotLy8JCVN0cmluZyBhYXJEaXJTdHJpbmcgPSAgRmlsZVV0aWxzLmFkZEFub3RoZXJOb2RlVG9QYXRoKHdlYnNlcnZpY2VzRGlyLCAKLS8vIAkJQXhpczJDcmVhdGlvblVJTWVzc2FnZXMuRElSX0FBUik7Ci0vLwkJRmlsZSBhYXJEaXIgPSBuZXcgRmlsZShhYXJEaXJTdHJpbmcpOwotLy8JCUZpbGVVdGlscy5jcmVhdGVEaXJlY3RvcnlzKGFhckRpclN0cmluZyk7Ci0vLwkJQUFSRmlsZVdyaXRlciBhYXJGaWxlV3JpdGVyID0gbmV3IEFBUkZpbGVXcml0ZXIoKTsKLS8vCQlGaWxlIHNlcnZpc2VEaXIgPSBuZXcgRmlsZShzZXJ2aWNlc0RpcmVjdG9yeSk7Ci0vLwkJYWFyRmlsZVdyaXRlci53cml0ZUFBUkZpbGUoYWFyRGlyLCBzZXJ2aWNlTmFtZSArIAotLy8JCUF4aXMyQ3JlYXRpb25VSU1lc3NhZ2VzLkZJTEVfQUFSLCBzZXJ2aXNlRGlyKTsKLQkJCi0JCQotCQkvL0ltcG9ydCBhbGwgdGhlIHN0dWZmIGZvcm0gdGhlIC5tYXRhZGF0YSBkaXJlY3RvcnkgdG8gaW5zaWRlIHRoZSBjdXJyZW50IHdlYiBwcm9qZWN0Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKAotCQkJCQlOTFMuYmluZChBeGlzMkNyZWF0aW9uVUlNZXNzYWdlcy5FUlJPUl9JTlZBTElEX0ZJTEVfUkVBRF9XUklURUwsCi0JCQkJCQkJbmV3IFN0cmluZ1tde2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIGUpOwotCQkJZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7IAotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJc3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoCi0JCQkJCU5MUy5iaW5kKEF4aXMyQ3JlYXRpb25VSU1lc3NhZ2VzLkVSUk9SX0lOVkFMSURfU0VSVklDRV9DUkVBVElPTiwKLQkJCQkJCQluZXcgU3RyaW5nW117ZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCl9KSwgZSk7Ci0JCQllbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsgCi0JCX0KLQkgICAgCi0JCi0gICAgCi0gICAgcmV0dXJuIHN0YXR1czsKLX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL2NvbW1hbmQvQXhpczJXU0RMMkphdmFDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY3JlYXRpb24vY29yZS9jb21tYW5kL0F4aXMyV1NETDJKYXZhQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjY1MTQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL2NvbW1hbmQvQXhpczJXU0RMMkphdmFDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBXU08yIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMTE4ICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIAotICogCQkJCQkJCQkJCSAgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSAqIDIwMDcwNDI2ICAgMTgzMDQ2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSAqIDIwMDcwNTA3ICAgMTg0NzI5IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSAqIDIwMDcwNTE4ICAgMTg3MzExIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEZpeGluZyB0ZXN0IHJlc291cmNlIGFkZGl0aW9uCi0gKiAyMDA3MDgxMyAgIDE5NjE3MyAgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgRml4IDE5NjE3MywgRFdQIGN1c3RvbSBsb2NhdGlvbiBmaXgKLSAqIDIwMDcwODE0ICAgMTg3ODQwIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEZpeGluZyAxODc4NDAgSVRFIG1lc3NhZ2UKLSAqIDIwMDcwODE0ICAgMTkzNTkzIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIGN1c3RvbSBwYWNrYWdlIG5hbWUgZml4Ci0gKiAyMDA4MDIxMyAgIDIxODkxMCBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbgotICogMjAwODA2MjEgICAyMDAwNjkgc2FtaW5kYXdAd3NvMi5jb20gLSBTYW1pbmRhIFdpamVyYXRuZSwgc2F2aW5nIHRoZSByZXRyaWV2ZWQgV1NETCBzbyBubyBuZWVkIHRvIHJldHJpZXZlIGl0IGFnYWluCi0gKiAyMDA4MDYxNiAgIDIzNzM2MyBzYW1pbmRhd0B3c28yLmNvbSAtIFNhbWluZGEgV2lqZXJhdG5lLCBnZXQgUmVzb3VyY2VDb250ZXh0IGZyb20gZW52aXJvbm1lbnQgaW5zdGVhZCBvZiBwcmVmZXJlbmNlCi0gKiAyMDA4MDkyNCAgIDI0NzkyOSBzYW1pbmRhd0B3c28yLmNvbSAtIFNhbWluZGEgV2lqZXJhdG5lLCBzb3VyY2UgZm9sZGVyIG5vdCBjb3JyZWN0bHkgc2V0Ci0gKiAyMDA5MDMwNyAgIDE5Njk1NCBzYW1pbmRhd0B3c28yLmNvbSAtIFNhbWluZGEgV2lqZXJhdG5lLCBTdXBwb3J0IFhNTEJlYW5zIGRhdGEgYmluZGluZwotICogMjAwOTEyMDcgICAxOTM5OTYgc2FtaW5kYXdAd3NvMi5jb20gLSBTYW1pbmRhIFdpamVyYXRuZSwgc2VsZWN0aW5nIGEgc3BlY2lmaWMgc2VydmljZS9wb3J0bmFtZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUudXRpbHMuQ29udGVudENvcHlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS51dGlscy5XU0RMMkphdmFHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLmNvcmUudXRpbHMuV1NETFByb3BlcnR5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLnV0aWxzLkF4aXMyQ29yZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLnV0aWxzLkNsYXNzTG9hZGluZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUudXRpbHMuRmFjZXRDb250YWluZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS51dGlscy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUuZGF0YS5EYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUubWVzc2FnZXMuQXhpczJDcmVhdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUudXRpbHMuUGF0aExvYWRpbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSVN0YXR1c0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIEF4aXMyV1NETDJKYXZhQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLQkKLQkgIHByaXZhdGUgRGF0YU1vZGVsIG1vZGVsOwotCQkKLQkgIHB1YmxpYyBBeGlzMldTREwySmF2YUNvbW1hbmQoIERhdGFNb2RlbCBtb2RlbCApewotCSAgICB0aGlzLm1vZGVsID0gbW9kZWw7ICAKLQkgIH0KLQotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykKLQkJCQkJCQkJCQkJCQkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7ICAKLQkJSUVudmlyb25tZW50IGVudmlyb25tZW50ID0gZ2V0RW52aXJvbm1lbnQoKTsKLQkJSVN0YXR1c0hhbmRsZXIgc3RhdHVzSGFuZGxlciA9IGVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKTsJCi0JCQotCQlQYXRoTG9hZGluZ1V0aWwuaW5pdChtb2RlbCk7Ci0JCVN0cmluZyB0ZW1wQ29kZWdlbk91dHB1dExvY2F0aW9uID1QYXRoTG9hZGluZ1V0aWwuZ2V0VGVtcENvZGVnZW5PdXRwdXRMb2NhdGlvbigpOwotCQlTdHJpbmcgY3VycmVudER5bmFtaWNXZWJQcm9qZWN0RGlyID0gRmFjZXRDb250YWluZXJVdGlscy5nZXRQcm9qZWN0Um9vdCgKLQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuZ2V0V2ViUHJvamVjdE5hbWUoKSkudG9PU1N0cmluZygpOwotCQkKLQkJRmlsZSB0ZW1wQ29kZWdlbkxvY2F0aW9uRmlsZSA9IG5ldyBGaWxlKHRlbXBDb2RlZ2VuT3V0cHV0TG9jYXRpb24pOwotCQlpZiAodGVtcENvZGVnZW5Mb2NhdGlvbkZpbGUuZXhpc3RzKCkpRmlsZVV0aWxzLmRlbGV0ZURpcmVjdG9yaWVzKHRlbXBDb2RlZ2VuT3V0cHV0TG9jYXRpb24pOwotCQlGaWxlVXRpbHMuY3JlYXRlRGlyZWN0b3J5cyh0ZW1wQ29kZWdlbk91dHB1dExvY2F0aW9uKTsKLSAgICAgICAgV1NETDJKYXZhR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBXU0RMMkphdmFHZW5lcmF0b3IoKTsgCi0gICAgICAgIAotICAgICAgICAvL0F4aXNTZXJ2aWNlIHNlcnZpY2U7Ci0gICAgICAgIE9iamVjdCBheGlzU2VydmljZUluc3RhbmNlOwotICAgICAgIAotICAgICAgICBTdHJpbmcgdHJhbnNmb3JtZXJGYWN0b3J5ID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiB0cmFuc2Zvcm1lckZhY3RvcnlNb2RpZmllZCA9IGZhbHNlOwotICAgICAgICAKLQl0cnkgewotCQkvLyB1c2UgdGhlIHhhbGFuIHRyYW5zZm9ybWVyIGZhY3RvcnkgaWYgbG9hZGFibGUKLQkJdHJ5IHsKLQkJCXRyYW5zZm9ybWVyRmFjdG9yeSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3RvcnkiKTsKLQkJCUNsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yLlRyYW5zZm9ybWVyRmFjdG9yeUltcGwiKTsKLQkJCVN0cmluZyBtb2RpZmllZFRyYW5zZm9ybWVyRmFjdG9yeSA9ICJvcmcuYXBhY2hlLnhhbGFuLnByb2Nlc3Nvci5UcmFuc2Zvcm1lckZhY3RvcnlJbXBsIjsKLQkJCWlmICghbW9kaWZpZWRUcmFuc2Zvcm1lckZhY3RvcnkuZXF1YWxzKHRyYW5zZm9ybWVyRmFjdG9yeSkpIHsKLQkJCQlTeXN0ZW0uc2V0UHJvcGVydHkoImphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5IiwgbW9kaWZpZWRUcmFuc2Zvcm1lckZhY3RvcnkpOwotCQkJCXRyYW5zZm9ybWVyRmFjdG9yeU1vZGlmaWVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQljYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBJZiBjbGFzcyBub3QgZm91bmQsIGtlZXAgdXNpbmcgdGhlIGRlZmF1bHQgdHJhbnNmb3JtZXIgZmFjdG9yeS4KLQkJfQotCQkKLQkJLy9zZXJ2aWNlID0gZ2VuZXJhdG9yLmdldEF4aXNTZXJ2aWNlKG1vZGVsLmdldFdzZGxVUkkoKSk7Ci0JCUNsYXNzTG9hZGluZ1V0aWwuaW5pdChtb2RlbC5nZXRXZWJQcm9qZWN0TmFtZSgpKTsKLQkJYXhpc1NlcnZpY2VJbnN0YW5jZSA9IGdlbmVyYXRvci5nZXRBeGlzU2VydmljZShtb2RlbC5nZXRXc2RsVVJJKCksbW9kZWwuZ2V0U2VydmljZVFOYW1lKCksbW9kZWwuZ2V0UG9ydE5hbWUoKSk7Ci0gICAgICAgIE1hcCBvcHRpb25zTWFwID0gZ2VuZXJhdG9yLmZpbGxPcHRpb25NYXAoCQotICAgICAgICAJZmFsc2UsICAvL2FzeW5jIGFsd2F5cyBmYWxzZQotICAgICAgICAgICAgZmFsc2UsCS8vc3luYyBhbHdheXMgZmFsc2UKLSAgICAgICAgICAgIHRydWUsICAgLy9pcyBzZXJ2ZXJzaWRlIHRydWUKLSAgICAgICAgICAgIG1vZGVsLmlzU2VydmVyWE1MQ2hlY2soKSwKLSAgICAgICAgICAgIGZhbHNlLCAgLy9ObyB0ZXN0IGNhc2Ugd2l0aCBvdXQgc3R1YgotICAgICAgICAgICAgbW9kZWwuaXNHZW5lcmF0ZUFsbENoZWNrKCksCi0gICAgICAgICAgICAobW9kZWwuZ2V0U2VydmljZU5hbWUoKSE9bnVsbCk/bW9kZWwuZ2V0U2VydmljZU5hbWUoKTpudWxsLAotICAgICAgICAgICAgKG1vZGVsLmdldFBvcnROYW1lKCkhPW51bGwpP21vZGVsLmdldFBvcnROYW1lKCk6bnVsbCwKLSAgICAgICAgICAgIChtb2RlbC5nZXREYXRhYmluZGluZ1R5cGUoKS50b0xvd2VyQ2FzZSgpIT1udWxsKT8KLSAgICAgICAgICAgIAkJbW9kZWwuZ2V0RGF0YWJpbmRpbmdUeXBlKCkudG9Mb3dlckNhc2UoKToKLSAgICAgICAgICAgIAkJbnVsbCwKLSAgICAgICAgICAgIChtb2RlbC5nZXRXc2RsVVJJKCkhPW51bGwpP21vZGVsLmdldFdzZGxVUkkoKTpudWxsLAotICAgICAgICAgICAgKG1vZGVsLmdldFBhY2thZ2VUZXh0KCkhPW51bGwpP21vZGVsLmdldFBhY2thZ2VUZXh0KCk6bnVsbCwKLSAgICAgICAgICAgICJqYXZhIiwKLSAgICAgICAgICAgIHRlbXBDb2RlZ2VuT3V0cHV0TG9jYXRpb24sCi0gICAgICAgICAgICBBeGlzMkNvcmVVdGlscy5nZXRTb3VyY2VGb2xkZXIobW9kZWwuZ2V0V2ViUHJvamVjdE5hbWUoKSksCi0gICAgICAgICAgICBtb2RlbC5nZXROYW1lc3Bhc2VUb1BhY2thZ2VNYXBwaW5nKCksCi0gICAgICAgICAgICBtb2RlbC5pc0dlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZSgpCi0gICAgICAgICAgKTsKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAvL0NvZGVHZW5Db25maWd1cmF0aW9uIGNvZGVnZW5Db25maWcgPSBuZXcgQ29kZUdlbkNvbmZpZ3VyYXRpb24oc2VydmljZSwgb3B0aW9uc01hcCk7Ci0JCUNsYXNzIENvZGVHZW5Db25maWd1cmF0aW9uQ2xhc3MgPSBDbGFzc0xvYWRpbmdVdGlsCi0JCQkJLmxvYWRDbGFzc0Zyb21BbnRDbGFzc0xvYWRlcigib3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uQ29kZUdlbkNvbmZpZ3VyYXRpb24iKTsKLQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KLQkJLy9GaXggZm9yIHRoZSBBeGlzMiAxLjIgCi0JCS8vQ29uc3RydWN0b3IgQ29kZUdlbkNvbmZpZ3VyYXRpb25Db25zdHJ1Y3RvciA9IENvZGVHZW5Db25maWd1cmF0aW9uQ2xhc3MKLQkJLy8JCS5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXXtheGlzU2VydmljZUluc3RhbmNlLmdldENsYXNzKCksTWFwLmNsYXNzfSk7Ci0JCS8vT2JqZWN0IENvZGVHZW5Db25maWd1cmF0aW9uSW5zdGFuY2UgPSBDb2RlR2VuQ29uZmlndXJhdGlvbkNvbnN0cnVjdG9yCi0JCS8vCQkubmV3SW5zdGFuY2UobmV3IE9iamVjdFtde2F4aXNTZXJ2aWNlSW5zdGFuY2Usb3B0aW9uc01hcH0pOwotCQkKLQkJQ29uc3RydWN0b3IgQ29kZUdlbkNvbmZpZ3VyYXRpb25Db25zdHJ1Y3RvciA9IENvZGVHZW5Db25maWd1cmF0aW9uQ2xhc3MKLQkJCQkuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW117TWFwLmNsYXNzfSk7Ci0JCU9iamVjdCBDb2RlR2VuQ29uZmlndXJhdGlvbkluc3RhbmNlID0gQ29kZUdlbkNvbmZpZ3VyYXRpb25Db25zdHJ1Y3RvcgotCQkJCS5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W117b3B0aW9uc01hcH0pOwotCQkKLQkJLy8gY29kZWdlbkNvbmZpZy5hZGRBeGlzU2VydmljZShzZXJ2aWNlKTsKLQkJTWV0aG9kIGFkZEF4aXNTZXJ2aWNlTWV0aG9kID0gQ29kZUdlbkNvbmZpZ3VyYXRpb25DbGFzcwotCQkJCS5nZXRNZXRob2QoImFkZEF4aXNTZXJ2aWNlIiwgbmV3IENsYXNzW117IGF4aXNTZXJ2aWNlSW5zdGFuY2UuZ2V0Q2xhc3MoKX0pOwotCQlhZGRBeGlzU2VydmljZU1ldGhvZC5pbnZva2UoQ29kZUdlbkNvbmZpZ3VyYXRpb25JbnN0YW5jZSwgCi0JCQkJCQkJbmV3IE9iamVjdFtde2F4aXNTZXJ2aWNlSW5zdGFuY2V9KTsKLQkJCi0gICAgICAgIC8vc2V0IHRoZSB3c2RsIGRlZmluaXNpb24gZm9yIGNvZGVnZW4gY29uZmlnIGZvciBza2VsZXRvbiBnZW5lcmFyaW9uLgotICAgICAgICBXU0RMUHJvcGVydHlSZWFkZXIgcmVhZGVyID0gbmV3IFdTRExQcm9wZXJ0eVJlYWRlcihtb2RlbCk7Ci0gICAgICAgIHJlYWRlci5yZWFkV1NETChtb2RlbC5nZXRXZWJQcm9qZWN0TmFtZSgpLG1vZGVsLmdldFdzZGxVUkkoKSk7Ci0gICAgICAgIE9iamVjdCB3c2RsRGVmaW5pdGlvbkluc3RhbmNlID0gcmVhZGVyLmdldFdzZGxEZWZpbml0aW9uSW5zdGFuY2UoKTsKLSAgICAgICAgLy9DbGFzcyBEZWZpbml0aW9uQ2xhc3MgPSBDbGFzc0xvYWRpbmdVdGlsLmxvYWRDbGFzc0Zyb21BbnRDbGFzc0xvYWRlcigiamF2YXgud3NkbC5EZWZpbml0aW9uIik7Ci0gICAgICAgIC8vY29kZWdlbkNvbmZpZy5zZXRXc2RsRGVmaW5pdGlvbih3c2RsRGVmaW5pdGlvbik7Ci0JCU1ldGhvZCBzZXRXc2RsRGVmaW5pdGlvbk1ldGhvZCA9IENvZGVHZW5Db25maWd1cmF0aW9uQ2xhc3MKLQkJCQkuZ2V0TWV0aG9kKCJzZXRXc2RsRGVmaW5pdGlvbiIsIG5ldyBDbGFzc1tde3JlYWRlci5nZXRXc2RsRGVmaW5pdGlvbkNsYXNzKCl9KTsKLQkJc2V0V3NkbERlZmluaXRpb25NZXRob2QuaW52b2tlKENvZGVHZW5Db25maWd1cmF0aW9uSW5zdGFuY2UsIAotCQkJCQluZXcgT2JqZWN0W117d3NkbERlZmluaXRpb25JbnN0YW5jZX0pOyAgICAgICAKLSAgICAgICAgCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwotCi0JCS8vc2V0IHRoZSBiYXNlVVJJCi0gICAgICAgIC8vY29kZWdlbkNvbmZpZy5zZXRCYXNlVVJJKGdlbmVyYXRvci5nZXRCYXNlVXJpKG1vZGVsLmdldFdzZGxVUkkoKSkpOwotCQkKLQkJTWV0aG9kIHNldEJhc2VVUklNZXRob2QgPSBDb2RlR2VuQ29uZmlndXJhdGlvbkNsYXNzCi0JCQkuZ2V0TWV0aG9kKCJzZXRCYXNlVVJJIiwgbmV3IENsYXNzW117IFN0cmluZy5jbGFzc30pOwotCQlzZXRCYXNlVVJJTWV0aG9kLmludm9rZShDb2RlR2VuQ29uZmlndXJhdGlvbkluc3RhbmNlLCAKLQkJCQkJCQkJbmV3IE9iamVjdFtde2dlbmVyYXRvci5nZXRCYXNlVXJpKG1vZGVsLmdldFdzZGxVUkkoKSl9KTsKLQkJCi0JCS8vR2V0IHRoZSBuYW1lc3BhY2UgZnJvbSB0aGUgQXhpc1NlcnZpY2UgYW5kIHNldCBpdCBpbiB0aGUgY29uZmlndXJhdGlvbiAKLQkJQ2xhc3MgQXhpc1NlcnZpY2VDbGFzcyA9IENsYXNzTG9hZGluZ1V0aWwKLQkJCQkJLmxvYWRDbGFzc0Zyb21BbnRDbGFzc0xvYWRlcigib3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZSIpOwkJCi0JCU1ldGhvZCBnZXRUYXJnZXROYW1lc3BhY2VNZXRob2QgPSBBeGlzU2VydmljZUNsYXNzLmdldE1ldGhvZCgiZ2V0VGFyZ2V0TmFtZXNwYWNlIiwgbnVsbCk7Ci0JCU9iamVjdCB0YXJnZXROYW1lc3BhY2UgPSBnZXRUYXJnZXROYW1lc3BhY2VNZXRob2QuaW52b2tlKGF4aXNTZXJ2aWNlSW5zdGFuY2UsIG51bGwpOwotCQkKLQkJT2JqZWN0IHN0cmluZ1JldHVybiA9IG51bGw7Ci0JCWlmKG1vZGVsLmdldFBhY2thZ2VUZXh0KCkhPW51bGwpewotCQkJc3RyaW5nUmV0dXJuID0gbW9kZWwuZ2V0UGFja2FnZVRleHQoKTsKLQkJfWVsc2V7Ci0JCQlDbGFzcyBVUkxQcm9jZXNzb3JDbGFzcyA9IENsYXNzTG9hZGluZ1V0aWwKLQkJCQkJLmxvYWRDbGFzc0Zyb21BbnRDbGFzc0xvYWRlcigib3JnLmFwYWNoZS5heGlzMi51dGlsLlVSTFByb2Nlc3NvciIpOwotCQkJTWV0aG9kIG1ha2VQYWNrYWdlTmFtZU1ldGhvZCA9IFVSTFByb2Nlc3NvckNsYXNzCi0JCQkJCS5nZXRNZXRob2QoIm1ha2VQYWNrYWdlTmFtZSIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzc30pOwotCQkJc3RyaW5nUmV0dXJuID0gbWFrZVBhY2thZ2VOYW1lTWV0aG9kLmludm9rZShudWxsLCBuZXcgT2JqZWN0W117dGFyZ2V0TmFtZXNwYWNlfSk7Ci0JCX0KLQkJCi0JCW1vZGVsLnNldFBhY2thZ2VUZXh0KHN0cmluZ1JldHVybi50b1N0cmluZygpKTsKLQkJCi0JCU1ldGhvZCBzZXRQYWNrYWdlTmFtZU1ldGhvZCA9IENvZGVHZW5Db25maWd1cmF0aW9uQ2xhc3MKLQkJCQkJLmdldE1ldGhvZCgic2V0UGFja2FnZU5hbWUiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KTsKLQkJc2V0UGFja2FnZU5hbWVNZXRob2QuaW52b2tlKENvZGVHZW5Db25maWd1cmF0aW9uSW5zdGFuY2UsIG5ldyBPYmplY3RbXXtzdHJpbmdSZXR1cm59KTsKLQkJCi0gICAgICAgIC8vbmV3IENvZGVHZW5lcmF0aW9uRW5naW5lKGNvZGVnZW5Db25maWcpLmdlbmVyYXRlKCk7Ci0JCUNsYXNzIENvZGVHZW5lcmF0aW9uRW5naW5lQ2xhc3MgPSBDbGFzc0xvYWRpbmdVdGlsCi0JCQkJLmxvYWRDbGFzc0Zyb21BbnRDbGFzc0xvYWRlcigib3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uQ29kZUdlbmVyYXRpb25FbmdpbmUiKTsKLQkJQ29uc3RydWN0b3IgQ29kZUdlbmVyYXRpb25FbmdpbmVDb25zdHJ1Y3RvciA9IENvZGVHZW5lcmF0aW9uRW5naW5lQ2xhc3MKLQkJCQkJCS5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXXtDb2RlR2VuQ29uZmlndXJhdGlvbkluc3RhbmNlLmdldENsYXNzKCl9KTsKLQkJT2JqZWN0IENvZGVHZW5lcmF0aW9uRW5naW5lSW5zdGFuY2UgID0gQ29kZUdlbmVyYXRpb25FbmdpbmVDb25zdHJ1Y3RvcgotCQkJCQkJLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXXtDb2RlR2VuQ29uZmlndXJhdGlvbkluc3RhbmNlfSk7Ci0JCQotCQkvL0ludm9rZSBDb2RlZ2VuIE1ldGhvZAotCQlNZXRob2QgZ2VuZXJhdGVNZXRob2QgPSBDb2RlR2VuZXJhdGlvbkVuZ2luZUNsYXNzLmdldE1ldGhvZCgiZ2VuZXJhdGUiLCBudWxsKTsKLQkJZ2VuZXJhdGVNZXRob2QuaW52b2tlKENvZGVHZW5lcmF0aW9uRW5naW5lSW5zdGFuY2UsIG51bGwpOwotCQkKLSAgICAgICAgCi0JCS8vQ29weSB0aGUgZXhpc3RpbmcgY29kZWdlbiByZXN1bHRzIHRvIHRoZSBjdXJyZW50IHByb2plY3QKLSAgICAgICAgQ29udGVudENvcHlVdGlscyBjb250ZW50Q29weVV0aWxzID0gbmV3IENvbnRlbnRDb3B5VXRpbHMoZ2V0RW52aXJvbm1lbnQoKSk7Ci0JICAgIHN0YXR1cyA9IGNvbnRlbnRDb3B5VXRpbHMuY29weURpcmVjdG9yeVJlY3Vyc2l2ZWx5SW50b1dvcmtzcGFjZSgKLQkgICAgCQkJCQkJCXRlbXBDb2RlZ2VuT3V0cHV0TG9jYXRpb24sIAotCSAgICAJCQkJCQkJY3VycmVudER5bmFtaWNXZWJQcm9qZWN0RGlyLCAKLQkgICAgCQkJCQkJCW1vbml0b3IsIAotCSAgICAJCQkJCQkJc3RhdHVzSGFuZGxlcik7Ci0KLQkgICAgSVByb2plY3QgcHJvamVjdCA9IEZhY2V0Q29udGFpbmVyVXRpbHMuZ2V0UHJvamVjdE5hbWUobW9kZWwuZ2V0V2ViUHJvamVjdE5hbWUoKSk7Ci0JICAgIElGb2xkZXIgZm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIoInJlc291cmNlcyIpOwotCSAgICBpZiAoZm9sZGVyLmV4aXN0cygpKXsKLQkgICAgCUF4aXMyQ29yZVV0aWxzLmFkZFJlc291cmNlc0ZvbGRlckFzQ2xhc3NQYXRoKHByb2plY3QpOwotCSAgICB9Ci0JfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJc3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoTkxTLmJpbmQoCi0JCQkJCQkJCQkJCUF4aXMyQ3JlYXRpb25VSU1lc3NhZ2VzLkVSUk9SX0NPREVHRU5fRVhDRVBUSU9OLAotCQkJCQkJCQkJCQluZXcgU3RyaW5nW117IiA6ICIrZS5nZXRDYXVzZSgpfSksCi0JCQkJCQkJCQkJZSk7Ci0JCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCWVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOyAKLQl9IGZpbmFsbHkgewotCQlpZiAodHJhbnNmb3JtZXJGYWN0b3J5TW9kaWZpZWQpIHsKLQkJCS8vIHJlc3RvcmUgdG8gdGhlIG9yaWdpbmFsIFRyYW5zZm9ybWVyRmFjdG9yeQotCQkJaWYgKHRyYW5zZm9ybWVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQkJU3lzdGVtLmNsZWFyUHJvcGVydHkoImphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5Iik7IAotCQkJfSBlbHNlIHsKLQkJCQlTeXN0ZW0uc2V0UHJvcGVydHkoImphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5IiwgdHJhbnNmb3JtZXJGYWN0b3J5KTsgCi0JCQl9Ci0JCX0KLQl9Ci0JCQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL2NvbW1hbmQvQXhpczJXZWJzZXJ2aWNlc1NlcnZlckNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL2NvbW1hbmQvQXhpczJXZWJzZXJ2aWNlc1NlcnZlckNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA1YzUwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY3JlYXRpb24vY29yZS9jb21tYW5kL0F4aXMyV2Vic2VydmljZXNTZXJ2ZXJDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAxMTAgICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgQXhpczIgCi0gKiAJCQkJCQkJCQkJICBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotICogMjAwNzA1MTAgICAxNzI5MjYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgRml4IDE3MjkyNiBVc2UgVXRpbCBDbGFzc2VzCi0gKiAyMDA3MDgxMyAgIDE5NjE3MyAgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgRml4IDE5NjE3MywgRFdQIGN1c3RvbSBsb2NhdGlvbiBmaXgKLSAqIDIwMDcwODI0ICAgMjAwNTE1IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIE5PTi1OTFMgbW92ZSB0byBzZXBlcmF0ZSBmaWxlCi0gKiAyMDA4MDYxNiAgIDIzNzM2MyBzYW1pbmRhd0B3c28yLmNvbSAtIFNhbWluZGEgV2lqZXJhdG5lLCBnZXQgUmVzb3VyY2VDb250ZXh0IGZyb20gZW52aXJvbm1lbnQgaW5zdGVhZCBvZiBwcmVmZXJlbmNlCi0gKiAyMDEwMDMwOAkgIDI4MjQ2NiBzYW1pbmRhd0B3c28yLmNvbSAtIFNhbWluZGEgV2lqZXJhdG5lLCBzdXBwb3J0IGZvciBheGlzMiAxLjUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS51dGlscy5Db250ZW50Q29weVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb3JlLnV0aWxzLkZhY2V0Q29udGFpbmVyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUudXRpbHMuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLmRhdGEuRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSVN0YXR1c0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5XZWJTZXJ2aWNlU2NlbmFyaW87Ci0KLXB1YmxpYyBjbGFzcyBBeGlzMldlYnNlcnZpY2VzU2VydmVyQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLQotCXByaXZhdGUgRGF0YU1vZGVsIG1vZGVsOwotCXByaXZhdGUgaW50IHNjZW5hcmlvOwotCi0JcHVibGljIEF4aXMyV2Vic2VydmljZXNTZXJ2ZXJDb21tYW5kKCBEYXRhTW9kZWwgbW9kZWwsIGludCBzY2VuYXJpbyApewotCQl0aGlzLm1vZGVsID0gbW9kZWw7ICAKLQkJdGhpcy5zY2VuYXJpbyA9IHNjZW5hcmlvOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pCi0JdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0KLQkJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQlJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBnZXRFbnZpcm9ubWVudCgpOwotCQlJU3RhdHVzSGFuZGxlciBzdGF0dXNIYW5kbGVyID0gZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpOwkKLQotCi0KLQkJQ29udGVudENvcHlVdGlscyBjb250ZW50Q29weVV0aWxzID0gbmV3IENvbnRlbnRDb3B5VXRpbHMoZ2V0RW52aXJvbm1lbnQoKSk7Ci0JCQotCQkvL0NoZWNrIGZvciB0aGUgc2VydmVyIHN0YXR1cwotCQlpZiAobW9kZWwuZ2V0U2VydmVyU3RhdHVzKCkpewotCQkJaWYgKHNjZW5hcmlvID09IFdlYlNlcnZpY2VTY2VuYXJpby5CT1RUT01VUCB8fCBzY2VuYXJpbyA9PSBXZWJTZXJ2aWNlU2NlbmFyaW8uVE9QRE9XTil7Ci0JCQkJU3RyaW5nIHdlYkNvbnRhaW5lckRpclN0cmluZyA9IEZhY2V0Q29udGFpbmVyVXRpbHMucGF0aFRvV2ViUHJvamVjdENvbnRhaW5lcigKLQkJCQkJCW1vZGVsLmdldFdlYlByb2plY3ROYW1lKCkpOwotCQkJCVN0cmluZyByZXBvc2l0b3J5U3RyaW5nID0gRmFjZXRDb250YWluZXJVdGlscy5nZXRBeGlzMldlYkNvbnRhaW5lclJlcG9zaXRvcnlQYXRoKAotCQkJCQkJd2ViQ29udGFpbmVyRGlyU3RyaW5nKTsgCi0JCQkJU3RyaW5nIHdlYnNlcnZpY2VUZW1wRGlyU3RyaW5nID0gbW9kZWwuZ2V0UGF0aFRvV2ViU2VydmljZXNUZW1wRGlyKCk7Ci0JCQkJLy9Db3B5IHRoZSBleGlzdGluZyBzZXJ2aWNlcyB0byB0aGUgcmVwb3NpdG9yeQotCQkJCXN0YXR1cyA9IGNvbnRlbnRDb3B5VXRpbHMuY29weURpcmVjdG9yeVJlY3Vyc2l2ZWx5SW50b1dvcmtzcGFjZSgKLQkJCQkJCQkJCQkJd2Vic2VydmljZVRlbXBEaXJTdHJpbmcsIAotCQkJCQkJCQkJCQlyZXBvc2l0b3J5U3RyaW5nLCAKLQkJCQkJCQkJCQkJbW9uaXRvciwgCi0JCQkJCQkJCQkJCXN0YXR1c0hhbmRsZXIpOwotCQkJCUZpbGVVdGlscy5kZWxldGVEaXJlY3Rvcmllcyh3ZWJzZXJ2aWNlVGVtcERpclN0cmluZyk7Ci0JCQl9Ci0JCQlzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQl9ZWxzZXsKLQkJCXN0YXR1cyA9IFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQl9Ci0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL21lc3NhZ2VzL0F4aXMyQ3JlYXRpb25VSS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvbWVzc2FnZXMvQXhpczJDcmVhdGlvblVJLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMDNkNGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvbWVzc2FnZXMvQXhpczJDcmVhdGlvblVJLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBXU08yIEluYy4gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSMgLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgMjAwNzAxMTAgICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgQXhpczIgCi0jCQkJCQkJCQkJCSBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotIyAyMDA3MDUxMSAgIDE4NjQ0MCBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoIGZpeCAxODY0NDAKLSMgMjAwNzA1MTcgICAxODczMDcgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgRml4IDE4NzMwNyBQcm9wZXJ0eSBGaWxlIEZpeAotIyAyMDA3MDUyOSAgIDE4ODc0MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBmaXggZm9yIDE4ODc0MgotIyAyMDA3MDYwMSAgIDE5MDUwNSBwbW9vZ2tAY2EuaWJtLmNvbSAtIFBldGVyIE1vb2drCi0jIDIwMDgwMTMwICAgMjE2OTk3IGthdGVwQHdzbzIuY29tIC0gS2F0ZSBQcmljZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBBeGlzMiBzZXJ2ZXIgY29tcG9uZW50IHR5cGUgbGFiZWxzCi0jCi1MQUJFTF9IQVZFX1NFUlZJQ0VTX1hNTF9GSUxFPVVzZSBhbiBleGlzdGluZyBzZXJ2aWNlcy54bWwgZmlsZQotTEFCRUxfREVGQVVMVF9TRVJWSUNFU19YTUxfRklMRT1HZW5lcmF0ZSBhIGRlZmF1bHQgc2VydmljZXMueG1sIGZpbGUKLUxBQkVMX0FYSVMyX1BSRUZFUkVOQ0VfUEFHRT1BeGlzMiBXZWIgU2VydmljZSBKYXZhIEJlYW4gQ29uZmlndXJhdGlvbgotTEFCRUxfQVhJUzJfUFJFRkVSRU5DRV9QQUdFX0hFQURJTkc9QXhpczIgV2ViIFNlcnZpY2UgSmF2YSBCZWFuIENvbmZpZ3VyYXRpb24KLUxBQkVMX0FYSVMyX1BSRUZFUkVOQ0VfUEFHRV9TVUJfSEVBRElORz1DdXN0b21pemUgeW91ciBXZWIgc2VydmljZQotTEFCRUxfQlJPV1NFPSZCcm93c2UKLUxBQkVMX0pBVkFfMl9XU0RMX1BBR0VfSEVBRElORz1BeGlzMiBXZWIgU2VydmljZSBTa2VsZXRvbiBKYXZhIEJlYW4gQ29uZmlndXJhdGlvbgotTEFCRUxfSkFWQV8yX1dTRExfUEFHRV9TVUJfSEVBRElORz1TZWxlY3QgdGhlIGFwcHJvcHJpYXRlIGNvZGUgZ2VuZXJhdGlvbiBzZXR0aW5ncwotTEFCRUxfU0VSVklDRV9OQU1FX0NBUFRJT049U2VydmljZSBOYW1lCi1MQUJFTF9HRU5FUkFURV9URVNUQ0FTRV9DQVBUSU9OPUdlbmVyYXRlIGEgSlVuaXQgdGVzdCBjYXNlIHRvIHRlc3QgdGhlIHNlcnZpY2UKLUxBQkVMX0RBVEFCSU5ESU5HX0NBUFRJT049RGF0YWJpbmRpbmcKLUxBQkVMX1BPUlROQU1FPVBvcnQgTmFtZQotTEFCRUxfR0VORVJBVEVfQUxMPUdlbmVyYXRlIGFsbCB0eXBlcyBmb3IgYWxsIGVsZW1lbnRzIHJlZmVycmVkIGJ5IHNjaGVtYXMKLUxBQkVMX0dFTkVSQVRFX1NFUlZFUlNJREVfSU5URVJGQUNFPUdlbmVyYXRlIGFuIGludGVyZmFjZSBmb3IgdGhlIHNrZWxldG9uCi1MQUJFTF9QQUNLRUdFX05BTUU9Q3VzdG9tIHBhY2thZ2UgbmFtZQotTEFCRUxfTkFNRVNQQUNFPU5hbWVzcGFjZQotTEFCRUxfUEFDS0FHRT1QYWNrYWdlCi1MQUJFTF9OQU1FU1BBQ0VfVE9fUEFDS0FHRT1OYW1lc3BhY2UgdG8gcGFja2FnZSBtYXBwaW5ncwotCi0jCi0jIEF4aXMyIHNlcnZlciBjb21wb25lbnQgdHlwZSBlcnJvcgotIwotRVJST1JfSU5WQUxJRF9TRVJWSUNFU19YTUw9WW91IG11c3Qgc2VsZWN0IGEgdmFsaWQgc2VydmljZXMueG1sIGZpbGUKLUVSUk9SX0lOVkFMSURfRklMRV9SRUFEX1dSSVRFTD1FeGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgcmVhZGluZyBvciB3cml0aW5nIGZpbGUgezB9Ci1FUlJPUl9JTlZBTElEX1dTRExfRklMRV9SRUFEX1dSSVRFTD1FeGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgcmVhZGluZyBvciB3cml0aW5nIFdTREwgezB9Ci1FUlJPUl9JTlZBTElEX1NFUlZJQ0VfQ1JFQVRJT049RXhjZXB0aW9uIG9jY3VycmVkIGR1cmluZyBzZXJ2aWNlIGNyZWF0aW9uCi1FUlJPUl9DT0RFR0VOX0VYQ0VQVElPTj1FeGNlcHRpb24gb2NjdXJyZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiBmb3IgdGhlIFdTREwgezB9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY3JlYXRpb24vY29yZS9tZXNzYWdlcy9BeGlzMkNyZWF0aW9uVUlNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvbWVzc2FnZXMvQXhpczJDcmVhdGlvblVJTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMyNDlmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY3JlYXRpb24vY29yZS9tZXNzYWdlcy9BeGlzMkNyZWF0aW9uVUlNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMTEwICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIHJ1bnRpbWUgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzYyCi0gKiAyMDA3MDQyNiAgIDE4MzA0NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKiAyMDA3MDUxMSAgIDE4NjQ0MCBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoIGZpeCAxODY0NDAKLSAqIDIwMDcwNTE3ICAgMTg3MzA3IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEZpeCAxODczMDcgUHJvcGVydHkgRmlsZSBGaXgKLSAqIDIwMDcwNjAxICAgMTkwNTA1IHBtb29na0BjYS5pYm0uY29tIC0gUGV0ZXIgTW9vZ2sKLSAqIDIwMDcwODI0ICAgMjAwNTE1IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIE5PTi1OTFMgbW92ZSB0byBzZXBlcmF0ZSBmaWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUubWVzc2FnZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgQXhpczJDcmVhdGlvblVJTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCi0JLy9nZXQgdGhlIGxhYmxlcyBmcm9tIHRoaXMgbWFzc2FnZXMgdG8gdGhlIHByb3BlcnRpZXMgZmlsZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9IAotCQkJIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLm1lc3NhZ2VzLkF4aXMyQ3JlYXRpb25VSSI7CS8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQXhpczJDcmVhdGlvblVJTWVzc2FnZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQkvL2xhYmVscwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX0hBVkVfU0VSVklDRVNfWE1MX0ZJTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfREVGQVVMVF9TRVJWSUNFU19YTUxfRklMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9BWElTMl9QUkVGRVJFTkNFX1BBR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfQVhJUzJfUFJFRkVSRU5DRV9QQUdFX0hFQURJTkc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfQVhJUzJfUFJFRkVSRU5DRV9QQUdFX1NVQl9IRUFESU5HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX0JST1dTRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9KQVZBXzJfV1NETF9QQUdFX0hFQURJTkc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfSkFWQV8yX1dTRExfUEFHRV9TVUJfSEVBRElORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9TRVJWSUNFX05BTUVfQ0FQVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9HRU5FUkFURV9URVNUQ0FTRV9DQVBUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX0RBVEFCSU5ESU5HX0NBUFRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfUE9SVE5BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfR0VORVJBVEVfQUxMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX0dFTkVSQVRFX1NFUlZFUlNJREVfSU5URVJGQUNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX1BBQ0tFR0VfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9OQU1FU1BBQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUxfUEFDS0FHRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTF9OQU1FU1BBQ0VfVE9fUEFDS0FHRTsKLQotCS8vZXJyb3IKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9JTlZBTElEX1NFUlZJQ0VTX1hNTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9JTlZBTElEX0ZJTEVfUkVBRF9XUklURUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfSU5WQUxJRF9XU0RMX0ZJTEVfUkVBRF9XUklURUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfSU5WQUxJRF9TRVJWSUNFX0NSRUFUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX0NPREVHRU5fRVhDRVBUSU9OOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQXhpczJDcmVhdGlvblVJTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvcGx1Z2luL1dlYlNlcnZpY2VBeGlzMkNyZWF0aW9uQ29yZVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvcGx1Z2luL1dlYlNlcnZpY2VBeGlzMkNyZWF0aW9uQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTlhZjhlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL3BsdWdpbi9XZWJTZXJ2aWNlQXhpczJDcmVhdGlvbkNvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDEzMCAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiAKLSAqIAkJCQkJCQkJCQkgIHJ1bnRpbWUgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzYyCi0gKiAyMDA3MDQyNiAgIDE4MzA0NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUucGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VBeGlzMkNyZWF0aW9uQ29yZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZSI7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgV2ViU2VydmljZUF4aXMyQ3JlYXRpb25Db3JlUGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgV2ViU2VydmljZUF4aXMyQ3JlYXRpb25Db3JlUGx1Z2luKCkgewotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbnMjc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlQXhpczJDcmVhdGlvbkNvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL3V0aWxzL0FBUkZpbGVXcml0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL3V0aWxzL0FBUkZpbGVXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJlZWJiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY3JlYXRpb24vY29yZS91dGlscy9BQVJGaWxlV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAxMTAgICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgQXhpczIgCi0gKiAJCQkJCQkJCQkJICBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotICogMjAwNzA4MjQgICAyMDA1MTUgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgTk9OLU5MUyBtb3ZlIHRvIHNlcGVyYXRlIGZpbGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS51dGlsczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5KYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUuY29uc3RhbnQuQXhpczJDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBBQVJGaWxlV3JpdGVyIGV4dGVuZHMgSmFyewotCi0gICAgcHVibGljIEFBUkZpbGVXcml0ZXIoKSB7Ci0gICAgICAgIHRoaXMuc2V0UHJvamVjdChuZXcgUHJvamVjdCgpKTsKLSAgICAgICAgdGhpcy5nZXRQcm9qZWN0KCkuaW5pdCgpOwotICAgICAgICB0aGlzLnNldFRhc2tUeXBlKEF4aXMyQ29uc3RhbnRzLkpBUl9UQVNLKTsKLSAgICAgICAgdGhpcy5zZXRUYXNrTmFtZShBeGlzMkNvbnN0YW50cy5KQVJfVEFTSyk7Ci0gICAgICAgIHRoaXMuc2V0T3duaW5nVGFyZ2V0KG5ldyBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXJnZXQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVBQVJGaWxlKEZpbGUgb3V0cHV0Rm9sZGVyLAotICAgIAkJCQkJCSBTdHJpbmcgb3V0cHV0RmlsZU5hbWUsCi0gICAgCQkJCQkJIEZpbGUgaW5wdXRGaWxlRm9sZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24sRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAoIW91dHB1dEZvbGRlci5leGlzdHMoKSl7Ci0gICAgICAgICAgICBvdXRwdXRGb2xkZXIubWtkaXIoKTsgLy9jcmVhdGUgdGhlIG91dHB1dCBwYXRoCi0gICAgICAgIH1lbHNlewotICAgICAgICAgICAgaWYgKCFvdXRwdXRGb2xkZXIuaXNEaXJlY3RvcnkoKSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZShvdXRwdXRGb2xkZXIsb3V0cHV0RmlsZU5hbWUpOwotICAgICAgICB0aGlzLnNldEJhc2VkaXIoaW5wdXRGaWxlRm9sZGVyKTsKLSAgICAgICAgdGhpcy5zZXREZXN0RmlsZSh0YXJnZXRGaWxlKTsKLQotICAgICAgICAvL3J1biB0aGUgdGFzawotICAgICAgICB0aGlzLnBlcmZvcm0oKTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY3JlYXRpb24vY29yZS91dGlscy9Db21tb25VdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvdXRpbHMvQ29tbW9uVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFkMDRmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY3JlYXRpb24vY29yZS91dGlscy9Db21tb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAxMTAgICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgQXhpczIgCi0gKiAJCQkJCQkJCQkJICBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLnV0aWxzOwotCi0KLXB1YmxpYyBjbGFzcyBDb21tb25VdGlscyB7Ci0JCi0JIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzTmFtZUZyb21RdWFsaWZpZWROYW1lKFN0cmluZyBxdWFsaWZpZWRDYWxzc05hbWUpewotCQkgLy9UaGlzIHdhcyBkb25lIGR1ZSB0byBub3Qgc3BsaXR0aW5nIHdpdGggLiBTdHJhbmdlCi0JCSBxdWFsaWZpZWRDYWxzc05hbWUgPSBxdWFsaWZpZWRDYWxzc05hbWUucmVwbGFjZSgnLicsICc6Jyk7Ci0JCSBTdHJpbmdbXSBwYXJ0cyA9IHF1YWxpZmllZENhbHNzTmFtZS5zcGxpdCgiOiIpOwotCQkgaWYgKHBhcnRzLmxlbmd0aCA9PSAwKXsKLQkJCSByZXR1cm4gIiI7Ci0JCSB9Ci0JCSByZXR1cm4gcGFydHNbcGFydHMubGVuZ3RoLTFdOwotCSB9Ci0JICAKLQkgcHVibGljIHN0YXRpYyBTdHJpbmcgcGFja2FnZU5hbWVGcm9tUXVhbGlmaWVkTmFtZShTdHJpbmcgcXVhbGlmaWVkQ2Fsc3NOYW1lKXsKLQkJIC8vVGhpcyB3YXMgZG9uZSBkdWUgdG8gbm90IHNwbGl0dGluZyB3aXRoIC4gU3RyYW5nZQotCQkgcXVhbGlmaWVkQ2Fsc3NOYW1lID0gcXVhbGlmaWVkQ2Fsc3NOYW1lLnJlcGxhY2UoJy4nLCAnOicpOwotCQkgU3RyaW5nW10gcGFydHMgPSBxdWFsaWZpZWRDYWxzc05hbWUuc3BsaXQoIjoiKTsKLQkJIFN0cmluZ0J1ZmZlciBwYWNrYWdlTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoLTE7IGkrKykgewotCQkJIHBhY2thZ2VOYW1lLmFwcGVuZChwYXJ0c1tpXSk7Ci0JCQkgaWYgKCEgKGkgPT0gcGFydHMubGVuZ3RoLTIpKXsKLQkJCQkgcGFja2FnZU5hbWUuYXBwZW5kKCIuIik7Ci0JCQkgfQotCQkgfQotCQkgcmV0dXJuIHBhY2thZ2VOYW1lLnRvU3RyaW5nKCk7Ci0JIH0KLQkgCi0JIAotCSBwdWJsaWMgc3RhdGljIFN0cmluZyBwYWNrZ2VOYW1lMlBhdGhOYW1lKFN0cmluZyBwYWNrYWdlTmFtZSl7Ci0JCSBwYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lLnJlcGxhY2UoJy4nLCAnLycpOwotCQkgcmV0dXJuIHBhY2thZ2VOYW1lOwotCSB9Ci0JIAotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY3JlYXRpb24vY29yZS91dGlscy9QYXRoTG9hZGluZ1V0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL3V0aWxzL1BhdGhMb2FkaW5nVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTI2MDExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL3V0aWxzL1BhdGhMb2FkaW5nVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMzMwICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIAotICogCQkJCQkJCQkJCSAgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSAqIDIwMDcwNDI2ICAgMTgzMDQ2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSAqIDIwMDcwNTA3ICAgMTg0NzQwIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSAqIDIwMDcwNTA3ICAgMTg1Njg2IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgKLSAqIDIwMDcwODI0ICAgMjAwNTE1IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIE5PTi1OTFMgbW92ZSB0byBzZXBlcmF0ZSBmaWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUudXRpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUuY29uc3RhbnQuQXhpczJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUudXRpbHMuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLmRhdGEuRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgUGF0aExvYWRpbmdVdGlsIHsKLQkKLQkvL01vZGVsCi0JcHJpdmF0ZSBzdGF0aWMgIERhdGFNb2RlbCBtb2RlbCA9IG51bGw7Ci0KLQkvL1BhdGhzCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRlbXBDb2RlZ2VuT3V0cHV0TG9jYXRpb24gPSBudWxsOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjdXJyZW50RHluYW1pY1dlYlByb2plY3REaXIgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyB3b3Jrc3BhY2VEaXJlY3RvcnkgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjdXJyZW50UHJvamVjdFdlYlByb2plY3ROYW1lID0gbnVsbDsKLQkKLQkvL0FscmVhZHkgQ29tcHV0ZWQKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGFscmVhZHlJbml0ID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBhbHJlYWR5Q29tcHV0ZVRlbXBDb2RlZ2VuT3V0cHV0TG9jYXRpb24gPSBmYWxzZTsKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGFscmVhZHlDb21wdXRlQ3VycmVudER5bmFtaWNXZWJQcm9qZWN0RGlyID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBhbHJlYWR5Q29tcHV0ZVdvcmtzcGFjZURpcmVjdG9yeSA9IGZhbHNlOwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gcmVxdWlyZVRvdXBkYXRlTW9kZWwgPSBmYWxzZTsKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdChEYXRhTW9kZWwgaW5wdXRNb2RlbCl7Ci0JCXJlcXVpcmVUb3VwZGF0ZU1vZGVsID0gIWFscmVhZHlJbml0IHx8IAotCQkhY3VycmVudFByb2plY3RXZWJQcm9qZWN0TmFtZS5lcXVhbHMoaW5wdXRNb2RlbC5nZXRXZWJQcm9qZWN0TmFtZSgpKTsKLQkJaWYocmVxdWlyZVRvdXBkYXRlTW9kZWwpewotCQltb2RlbCA9IGlucHV0TW9kZWw7Ci0JCWN1cnJlbnRQcm9qZWN0V2ViUHJvamVjdE5hbWUgPSBpbnB1dE1vZGVsLmdldFdlYlByb2plY3ROYW1lKCk7Ci0JCX0KLQkJfQotCi0JcHVibGljCXN0YXRpYyBTdHJpbmcgZ2V0V29ya3NwYWNlRGlyZWN0b3J5KCkgewotCQlpZiAoIWFscmVhZHlDb21wdXRlV29ya3NwYWNlRGlyZWN0b3J5KXsKLQkJCXdvcmtzcGFjZURpcmVjdG9yeSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkKLQkJCS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKLQkJCWFscmVhZHlDb21wdXRlV29ya3NwYWNlRGlyZWN0b3J5ID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gd29ya3NwYWNlRGlyZWN0b3J5OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDdXJyZW50RHluYW1pY1dlYlByb2plY3REaXIoKXsKLQkJaWYgKCFhbHJlYWR5Q29tcHV0ZUN1cnJlbnREeW5hbWljV2ViUHJvamVjdERpciB8fCByZXF1aXJlVG91cGRhdGVNb2RlbCl7Ci0JCQljdXJyZW50RHluYW1pY1dlYlByb2plY3REaXIgPSBGaWxlVXRpbHMuYWRkQW5vdGhlck5vZGVUb1BhdGgoCi0JCQlnZXRXb3Jrc3BhY2VEaXJlY3RvcnkoKSwgbW9kZWwuZ2V0V2ViUHJvamVjdE5hbWUoKSk7Ci0JCQlhbHJlYWR5Q29tcHV0ZUN1cnJlbnREeW5hbWljV2ViUHJvamVjdERpciA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIGN1cnJlbnREeW5hbWljV2ViUHJvamVjdERpcjsKLQl9Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGVtcENvZGVnZW5PdXRwdXRMb2NhdGlvbigpIHsKLQkJaWYgKCFhbHJlYWR5Q29tcHV0ZVRlbXBDb2RlZ2VuT3V0cHV0TG9jYXRpb24pewotCQkJU3RyaW5nW10gbm9kZXMgPSB7CQotCQkJCQlBeGlzMkNvbnN0YW50cy5ESVJfRE9UX01FVEFEQVRBLAotCQkJCQlBeGlzMkNvbnN0YW50cy5ESVJfRE9UX1BMVUdJTlMsCi0JCQkJCUF4aXMyQ29uc3RhbnRzLkFYSVMyX1BST0pFQ1QsCi0JCQkJCUF4aXMyQ29uc3RhbnRzLkNPREVHRU5fUkVTVUxUU307Ci0JCQl0ZW1wQ29kZWdlbk91dHB1dExvY2F0aW9uID0gRmlsZVV0aWxzLmFkZE5vZGVzVG9QYXRoKGdldFdvcmtzcGFjZURpcmVjdG9yeSgpLCBub2Rlcyk7Ci0JCQlhbHJlYWR5Q29tcHV0ZVRlbXBDb2RlZ2VuT3V0cHV0TG9jYXRpb24gPSB0cnVlOwotCQl9Ci0JCXJldHVybiB0ZW1wQ29kZWdlbk91dHB1dExvY2F0aW9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvdXRpbHMvUGx1Z2luTG9jYXRpb25GaW5kZXJVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY3JlYXRpb24vY29yZS91dGlscy9QbHVnaW5Mb2NhdGlvbkZpbmRlclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhhNGFhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY3JlYXRpb24vY29yZS91dGlscy9QbHVnaW5Mb2NhdGlvbkZpbmRlclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAxMzAgICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgQXhpczIgCi0gKiAJCQkJCQkJCQkJICBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLnV0aWxzOwotCi0KLXB1YmxpYyBjbGFzcyBQbHVnaW5Mb2NhdGlvbkZpbmRlclV0aWwgewotLy8JLyoqCi0vLwkgKiAgCi0vLwkgKiBAcmV0dXJuIHJldHVybnMgYSBWZWN0b3IgY29udGFpbmluZyBQbHVnaW5EYXRhIG9iamVjdHMuCi0vLwkgKiBFYWNoIFBsdWdpbkRhdGEgb2JqZWN0IHJlcHJlc2VudHMgYSBQbHVnaW4gZm91bmQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0vLwkgKiBwbHVnaW4gZGlyZWN0b3JpZXMKLS8vCSAqIGEuIHRoZSB0YXJnZXRQbGF0Zm9ybUxvY2F0aW9uXGVjbGlwc2VccGx1Z2lucyBkaXJlY3RvcnksIAotLy8JICogYi4gb3RoZXIgcGx1Z2luIGRpcmVjdG9yaWVzIGFzIHNwZWNpZmllZCBieSAqLmxpbmsgZmlsZXMgdW5kZXIgCi0vLwkgKiAgICB0YXJnZXRQbGF0Zm9ybVxlY2xpcHNlXGxpbmtzIGRpcmVjdG9yeSAKLS8vCSAqKi8gCi0vLwlwdWJsaWMgc3RhdGljIFZlY3RvciBnZXRQbHVnaW5zSW5UYXJnZXRQbGF0Zm9ybSgpewotLy8JCS8qKgotLy8JCS8vc3RlcDE6IEdldCBwYXRoIG9mIHRhcmdldCBwbGF0Zm9ybS4KLS8vCQkvL3N0ZXAyOiBQcmVwYXJlIHBhdGggb2YgbGlua3MgZm9sZGVyLgotLy8JCS8vc3RlcDM6IEdldCBsaXN0IG9mIGZpbGVzIGluIGxpbmtzIGZvbGRlci4KLS8vCQkvL3N0ZXA0OiBQYXJzZSBlYWNoIGxpbmsgZmlsZSBhbmQgZ2V0IHRoZSBwYXRoIG9mIGxpbmtlZCBFY2xpcHNlIGZvbGRlci4KLS8vCQkvL3N0ZXA1OiBQcmVwYXJlIGEgbGlzdCBvZiBhbGwgcGx1Z2luIHJvb3QgZm9sZGVycyAKLS8vCQkvLyAgICAgICAoRWNsaXBzZSBwbHVnaW5zIGFuZCBsaW5rZWQgRWNsaXBzZSBwbHVnaW5zKS4KLS8vCQkvL3N0ZXA2OiA2YS4gRm9yIGVhY2ggcGx1Z2luIHJvb3QgZm9sZGVyLCAKLS8vCQkvLyAgICAgICA2Yi4gZ28gdG8gZWFjaCBwbHVnaW4gZGlyZWN0b3J5IGFuZCBnZXQgcGF0aCBvZiBwbHVnaW4ueG1sLgotLy8JCS8vc3RlcDc6IFBhcnNlIHRoZSBwbHVnaW4ueG1sIGZpbGUgdG8gZ2V0IHBsdWdpbiBpZCwgcGx1Z2luIHZlcnNpb24sIAotLy8JCS8vICAgICAgIGFuZCBzdG9yZSBpbiB2ZWN0b3JzLCBsaXN0cywgZXRjLgotLy8JCS8vc3RlcDg6IEdvIGJhY2sgdG8gc3RlcCA2IHRvIGNvbnRpbnVlIHdpdGggbmV4dCBwbHVnaW4gZGlyZWN0b3J5LgotLy8JCSoqLwotLy8KLS8vCQkvL3N0ZXAxOiBHZXQgcGF0aCBvZiB0YXJnZXQgcGxhdGZvcm0uIAotLy8JCS8vRmFsbCBiYWNrIHRvIEVjbGlwc2UgaW5zdGFsbCBsb2NhdGlvbiBpZiB0YXJnZXRwbGF0Zm9ybSBpbiBub3Qgc2V0LgotLy8JCVVSTCBwbGF0Rm9ybVVSTCA9IFBsYXRmb3JtLmdldEluc3RhbGxMb2NhdGlvbigpLmdldFVSTCgpOwotLy8JCUxvY2F0aW9uIGxvY2F0aW9uID0gUGxhdGZvcm0uZ2V0SW5zdGFsbExvY2F0aW9uKCk7Ci0vLwkJSVBhdGggZWNsaXBzZVBhdGggPSBudWxsIDsJCQotLy8KLS8vCQkvL0dldCBwYXRoIG9mIHRhcmdldCBwbGF0Zm9ybSBhZ2FpbnN0IHdoaWNoIHRoZSB1c2VycyBvZiB0aGlzIHRvb2wgCi0vLwkJLy93aWxsIGNvbXBpbGUgdGhlaXIgY29kZS4JCi0vLy8vCQlJUGF0aCB0YXJnZXRQbGF0Rm9ybUxvY2F0aW9uID0gbmV3IFBhdGgoZ2V0VGFyZ2V0UGxhdGZvcm1QYXRoKHRydWUpKTsKLS8vLy8JCUlQYXRoIHRhcmdldFBsYXRGb3JtTG9jYXRpb24gPSBuZXcgUGF0aChTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikpOwotLy8KLS8vLy8JCWlmKF91c2VUYXJnZXRQbGF0Zm9ybSA9PSBmYWxzZSkKLS8vCQkJZWNsaXBzZVBhdGggPSBuZXcgUGF0aChwbGF0Rm9ybVVSTC5nZXRQYXRoKCkpOwotLy8vLwkJZWxzZQotLy8vLwkJCWVjbGlwc2VQYXRoID0gdGFyZ2V0UGxhdEZvcm1Mb2NhdGlvbjsKLS8vCQkKLS8vLy8JCXNob3dNZXNzYWdlKCJDb25zaWRlcmluZyB0YXJnZXQgcGxhdGZvcm0gdG8gYmU6ICIgKyAKLS8vLy8JCQkJCWVjbGlwc2VQYXRoLnRvU3RyaW5nKCkpOwotLy8JCQotLy8JCS8vc3RlcDI6IFByZXBhcmUgcGF0aCBvZiBsaW5rcyBmb2xkZXIuCi0vLwkJLy9zdGVwMzogR2V0IGxpc3Qgb2YgZmlsZXMgaW4gbGlua3MgZm9sZGVyLgkJCi0vLwkJLy9zdGVwNDogUGFyc2UgZWFjaCBsaW5rIGZpbGUgYW5kIGdldCB0aGUgcGF0aCBvZiBsaW5rZWQgRWNsaXBzZSBmb2xkZXIuCi0vLwkJSVBhdGggbGlua3NQYXRoID0gbmV3IFBhdGgoIGVjbGlwc2VQYXRoLnRvU3RyaW5nKCkgKS5hcHBlbmQoIi9saW5rcyIpOwotLy8JCVN0cmluZyBsaW5rZWRQYXRoc1tdID0gZ2V0TGlua2VkUGF0aHMobGlua3NQYXRoLnRvU3RyaW5nKCkpOwotLy8JCWludCBsaW5rZWRQYXRoTGVuZ3RoID0gMDsKLS8vCQlpZihudWxsICE9IGxpbmtlZFBhdGhzKXsKLS8vCQkJbGlua2VkUGF0aExlbmd0aCA9IGxpbmtlZFBhdGhzLmxlbmd0aDsKLS8vCQl9Ci0vLwkJCi0vLwkJLy9zdGVwNTogUHJlcGFyZSBhIGxpc3Qgb2YgYWxsIHBsdWdpbiByb290IGZvbGRlcnMgCi0vLwkJLy8gICAgICAgKEVjbGlwc2UgcGx1Z2lucyBhbmQgbGlua2VkIEVjbGlwc2UgcGx1Z2lucykuCi0vLwkJSVBhdGggZWNsaXBzZVBsdWdpblJvb3RGb2xkZXJzW10gPSBuZXcgSVBhdGhbbGlua2VkUGF0aExlbmd0aCArIDFdOwotLy8JCWVjbGlwc2VQbHVnaW5Sb290Rm9sZGVyc1swXSA9IAotLy8JCQluZXcgUGF0aCggZWNsaXBzZVBhdGgudG9TdHJpbmcoKSApLmFwcGVuZCgiL3BsdWdpbnMiKTsKLS8vCQlpZihudWxsICE9IGxpbmtlZFBhdGhzKXsKLS8vCQkJZm9yKGludCBpPTA7IGk8bGlua2VkUGF0aHMubGVuZ3RoOyBpKyspewotLy8JCQkJZWNsaXBzZVBsdWdpblJvb3RGb2xkZXJzW2krMV0gPSAKLS8vCQkJCW5ldyBQYXRoKGxpbmtlZFBhdGhzW2ldKS5hcHBlbmQoIi9lY2xpcHNlL3BsdWdpbnMiKTsKLS8vCQkJfQotLy8JCX0KLS8vCi0vLwkJLy9zdGVwNjogNmEuIEZvciBlYWNoIHBsdWdpbiByb290IGZvbGRlciwgCi0vLwkJLy8gICAgICAgNmIuIGdvIHRvIGVhY2ggcGx1Z2luIGRpcmVjdG9yeSBhbmQgZ2V0IHBhdGggb2YgcGx1Z2luLnhtbC4KLS8vCQkvL3N0ZXA3OiBQYXJzZSB0aGUgcGx1Z2luLnhtbCBmaWxlIHRvIGdldCBwbHVnaW4gaWQsIHBsdWdpbiB2ZXJzaW9uLCAKLS8vCQkvLyAgICAgICBhbmQgc3RvcmUgaW4gdmVjdG9ycywgbGlzdHMsIGV0Yy4KLS8vCQlWZWN0b3IgdmVjdG9yc0luVGhpc1ZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLS8vCQlmb3IoaW50IGk9MDsgaTxlY2xpcHNlUGx1Z2luUm9vdEZvbGRlcnMubGVuZ3RoOyBpKyspewotLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuPT09PT09PT1wbHVnaW4gSURzIGFuZCBWZXJzaW9ucyBpbiAiICsgCi0vLwkJCWVjbGlwc2VQbHVnaW5Sb290Rm9sZGVyc1tpXSArICI9PT09PT09PSIpOwotLy8JCQlWZWN0b3IgcGx1Z2luRGF0YU9ianMgID0gCi0vLwkJCWdldFBsdWdpbkRhdGFGb3JBbGxQbHVnaW5zKAotLy8JCQkJZWNsaXBzZVBsdWdpblJvb3RGb2xkZXJzW2ldLnRvU3RyaW5nKCkpOwotLy8JCQl2ZWN0b3JzSW5UaGlzVmVjdG9yLmFkZChwbHVnaW5EYXRhT2Jqcyk7Ci0vLwkJCVN5c3RlbS5vdXQucHJpbnRsbihwbHVnaW5EYXRhT2Jqcyk7Ci0vLwkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG49PT09PT09PT09PXx8fD09PSBlbmQgPT09fHx8PT09PT09PT09PT0iKTsKLS8vCQl9Ci0vLwkJCi0vLwkJVmVjdG9yIHBsdWdpbkRhdGEgPSBuZXcgVmVjdG9yKCk7Ci0vLwkJSXRlcmF0b3Igb3V0ZXJJdGVyYXRvciA9IHZlY3RvcnNJblRoaXNWZWN0b3IuaXRlcmF0b3IoKTsKLS8vCQl3aGlsZShvdXRlckl0ZXJhdG9yLmhhc05leHQoKSl7Ci0vLwkJCVZlY3RvciBwbHVnaW5EYXRhT2JqcyA9IChWZWN0b3Ipb3V0ZXJJdGVyYXRvci5uZXh0KCk7Ci0vLwkJCUl0ZXJhdG9yIGlubmVySXRlcmF0b3IgPSBwbHVnaW5EYXRhT2Jqcy5pdGVyYXRvcigpOwotLy8JCQl3aGlsZShpbm5lckl0ZXJhdG9yLmhhc05leHQoKSl7Ci0vLwkJCQlQbHVnaW5EYXRhIHBkID0gKFBsdWdpbkRhdGEpaW5uZXJJdGVyYXRvci5uZXh0KCk7Ci0vLwkJCQlTdHJpbmcgcGx1Z2luSWRLZXkgPSBwZC5nZXRQbHVnaW5JRCgpOwotLy8JCQkJU3RyaW5nIHZlcnNpb25WYWx1ZSA9IHBkLmdldFBsdWdpblZlcnNpb24oKTsKLS8vCQkJCVN0cmluZyBwbHVnaW5QYXRoID0gcGQuZ2V0UGx1Z2luTG9jYXRpb24oKTsKLS8vCQkJCXBsdWdpbkRhdGEuYWRkKHBkKTsKLS8vCQkJfQotLy8JCX0KLS8vCQkKLS8vCQlpbnQgYnJlYWtwb2ludD0wOwotLy8KLS8vCQlyZXR1cm4gcGx1Z2luRGF0YTsKLS8vCX0KLS8vCi0vLwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvdXRpbHMvU2VydmljZVhNTENyZWF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi9jcmVhdGlvbi9jb3JlL3V0aWxzL1NlcnZpY2VYTUxDcmVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MjdlMGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvdXRpbHMvU2VydmljZVhNTENyZWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDExMCAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiAKLSAqIAkJCQkJCQkJCQkgIHJ1bnRpbWUgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzYyCi0gKiAyMDA3MDYyMCAgIDE5MzQ0MSBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBmaXggZm9yIHRoZSBkaXNjcmlwdGlvbiBub3QgYXR0YWNoIHRvIHNlcnZpY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS51dGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlWE1MQ3JlYXRvciB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZU5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZUNsYXNzOwotICAgIHByaXZhdGUgQXJyYXlMaXN0IG9wZXJhdGlvbnM7Ci0KLSAgICBwdWJsaWMgU2VydmljZVhNTENyZWF0b3IoU3RyaW5nIHNlcnZpY2VOYW1lLCBTdHJpbmcgc2VydmljZUNsYXNzLCBBcnJheUxpc3Qgb3BlcmF0aW9ucykgewotICAgICAgICB0aGlzLnNlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7Ci0gICAgICAgIHRoaXMuc2VydmljZUNsYXNzID0gc2VydmljZUNsYXNzOwotICAgICAgICB0aGlzLm9wZXJhdGlvbnMgPSBvcGVyYXRpb25zOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VDbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VDbGFzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0IGdldE9wZXJhdGlvbnMoKSB7Ci0gICAgICAgIHJldHVybiBvcGVyYXRpb25zOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZyBzZXJ2aWNlWE1MID0gIjxzZXJ2aWNlIG5hbWU9XCIiICsgc2VydmljZU5hbWUgKyAiXCIgPlxuIiArCi0gICAgICAgICJcdDxEZXNjcmlwdGlvbj5cbiIgKwotICAgICAgICAiXHRcdFBsZWFzZSBUeXBlIHlvdXIgc2VydmljZSBkZXNjcmlwdGlvbiBoZXJlXG4iICsKLSAgICAgICAgIlx0PC9EZXNjcmlwdGlvbj5cbiIgKwotICAgICAgICAiXHQ8bWVzc2FnZVJlY2VpdmVycz5cbiIgKwotICAgICAgICAiXHRcdDxtZXNzYWdlUmVjZWl2ZXIgbWVwPVwiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW9ubHlcIiAiICsKLSAgICAgICAgImNsYXNzPVwib3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzLlJQQ0luT25seU1lc3NhZ2VSZWNlaXZlclwiIC8+XG4iICsKLSAgICAgICAgIlx0XHQ8bWVzc2FnZVJlY2VpdmVyICBtZXA9XCJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0XCIgICIgKwotICAgICAgICAiY2xhc3M9XCJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDTWVzc2FnZVJlY2VpdmVyXCIvPlxuIiArCi0gICAgICAgICJcdDwvbWVzc2FnZVJlY2VpdmVycz5cbiIgKyAKLSAgICAgICAgIlx0PHBhcmFtZXRlciBuYW1lPVwiU2VydmljZUNsYXNzXCIgbG9ja2VkPVwiZmFsc2VcIj4iICsgc2VydmljZUNsYXNzICsgIjwvcGFyYW1ldGVyPlxuIiA7IAotICAgICAgICBzZXJ2aWNlWE1MID0gc2VydmljZVhNTCArICI8L3NlcnZpY2U+XG4iOwotICAgICAgICByZXR1cm4gc2VydmljZVhNTDsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY3JlYXRpb24vY29yZS91dGlscy9TZXJ2aWNlc1hNTFV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvY3JlYXRpb24vY29yZS91dGlscy9TZXJ2aWNlc1hNTFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMzQ3ZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL2NyZWF0aW9uL2NvcmUvdXRpbHMvU2VydmljZXNYTUxVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBXU08yIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDgwNjA0ICAgMTkzMzcxIHNhbWluZGF3QHdzbzIuY29tIC0gU2FtaW5kYSBXaWplcmF0bmUsIGNyZWF0aW5nIGEgZnVuY3Rpb24gdG8gdmFsaWRhdGUgc2VydmljZXMueG1sCi0gKiAyMDA5MDEyMCAgIDI0ODAyMyBzYW1pbmRhd0B3c28yLmNvbSAtIFNhbWluZGEgV2lqZXJhdG5lLCB0aGUgeHNkIHJlc291cmNlIHBhdGggc3RyaW5nIHdhcyBub3QgdmFsaWQgZm9yIHdpbmRvd3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLnV0aWxzOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudmFsaWRhdGlvbi5TY2hlbWE7Ci1pbXBvcnQgamF2YXgueG1sLnZhbGlkYXRpb24uU2NoZW1hRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudmFsaWRhdGlvbi5WYWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb25zdGFudC5BeGlzMkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5wbHVnaW4uV2ViU2VydmljZUF4aXMyQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS51dGlscy5GaWxlVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlc1hNTFV0aWxzIHsKLQkKLQlwdWJsaWMgU2VydmljZXNYTUxVdGlscygpewotCX0KLQkKLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIGdpdmVuIHhtbCBmaWxlIGFnYWluc3QgdGhlIGF4aXMyIHNlcnZpY2VzIHNjaGVtYS4gCi0JICogQHJldHVybiByZXR1cm4gdHJ1ZSBpZiB0aGUgeG1sIGlzIHZhbGlkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzU2VydmljZXNYTUxWYWxpZChTdHJpbmcgc2VydmljZXNYbWxQYXRoKXsKLSAgICAgICAgU2NoZW1hRmFjdG9yeSBmYWN0b3J5ID0gCi0gICAgICAgICAgICBTY2hlbWFGYWN0b3J5Lm5ld0luc3RhbmNlKEF4aXMyQ29uc3RhbnRzLlhNTF9TQ0hFTUEpOwotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgCVN0cmluZyByZXNvdXJjZVBhdGg9QXhpczJDb25zdGFudHMuUkVTT1VSQ0VfRk9MREVSKyIvIitBeGlzMkNvbnN0YW50cy5TRVJWSUNFU19YU0RfU0NIRU1BX05BTUU7Ci0gICAgICAgICAgICBTY2hlbWEgc2NoZW1hID0gZmFjdG9yeS5uZXdTY2hlbWEoCi0gICAgICAgICAgICAJCVdlYlNlcnZpY2VBeGlzMkNvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRCdW5kbGUoKS5nZXRSZXNvdXJjZShyZXNvdXJjZVBhdGgpKTsKLSAgICAgICAgICAgIFZhbGlkYXRvciB2YWxpZGF0b3IgPSBzY2hlbWEubmV3VmFsaWRhdG9yKCk7Ci0gICAgICAgICAgICBTb3VyY2Ugc291cmNlID0gbmV3IFN0cmVhbVNvdXJjZShuZXcgRmlsZShzZXJ2aWNlc1htbFBhdGgpKTsKLSAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZShzb3VyY2UpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9ICAKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0ZTg2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLnVpLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzdiYmYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJ1aWxkLnhtbAotamF2YUNvbXBpbGVyLi4uYXJncwotQGRvdAotb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLnVpXzEuMC4xMDIuMjAwODA0MDIwMjA0LmphcgotdGVtcC5mb2xkZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLnVpLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ODQ2MmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODE2MTdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSNTdW4gTWF5IDA2IDE3OjMzOjUzIExLVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NjQ2NTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlUExVR0lOX05BTUUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMTA0LnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMyLmNyZWF0aW9uLnVpLnBsdWdpbi5XZWJTZXJ2aWNlQXhpczJDcmVhdGlvblVJUGx1Z2luCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLAotIG9yZy5lY2xpcHNlLndzdC53cywKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLAotIG9yZy5lY2xpcHNlLmVtZi5jb21tb24sCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi51aSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MudWkKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMyLmNyZWF0aW9uLnVpLndpZGdldHMuYmVhbiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpczIuY3JlYXRpb24udWkud2lkZ2V0cy5za2VsZXRvbiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpczIuY3JlYXRpb24udWkud3NydAotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1CdW5kbGUtVmVuZG9yOiAlUExVR0lOX1BST1ZJREVSCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc5OWJkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMxM2ExZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMgYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBXU08yIEluYyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotIyAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyAyMDA3MDEzMCAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZQotIwkJCQkJCQkJCQkgQXhpczIgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSMgMjAwNzA1MDIgICAxODQzMDIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgRml4IGNvcHlyaWdodCBmb3IgQXhpczIgcGx1Z2lucwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFmMjc2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotIyAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyAyMDA3MDUwMSAgIDE4NDYxNyBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBQcm92aWRlIHBsdWdpbiBkZXRhaWxzCi0jIDIwMDgwNTMwICAgMjM0ODQxIGthdGh5QGNhLmlibS5jb20gLSBLYXRoeSBDaGFuLCBDaGFuZ2UgcGx1Z2luIHByb3ZpZGVyIHRvIEVjbGlwc2Uub3JnCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgTWVzc2FnZXMgaW4gcGx1Z2luLnhtbC4KLSMKLVBMVUdJTl9OQU1FPVdlYnNlcnZpY2UgQXhpczIgQ3JlYXRpb24gVUkgUGx1Zy1pbgotUExVR0lOX1BST1ZJREVSPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLUxBQkVMX1JVTlRJTUVfQVhJU18yPUFwYWNoZSBBeGlzMgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMDRkNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldFJlZ2lzdHJ5Ij4KLSAgICAgIDx3aWRnZXRGYWN0b3J5ICAgCi0gICAgICAgIGlkPSJCZWFuRXhhbXBsZUNvbmZpZyIKLSAgICAgICAgaW5zZXJ0QmVmb3JlQ29tbWFuZElkPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS5jb21tYW5kLkF4aXMyQlVDb21tYW5kIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMyLmNyZWF0aW9uLnVpLndzcnQuQXhpczJCZWFuQ29uZmlnV2lkZ2V0RmFjdG9yeSIvPgotICAgIDwvZXh0ZW5zaW9uPiAKLSAgICAKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0UmVnaXN0cnkiPgotICAgICAgPHdpZGdldEZhY3RvcnkgICAKLSAgICAgICAgaWQ9IlNrZWxFeGFtcGxlQ29uZmlnIgotICAgICAgICBpbnNlcnRCZWZvcmVDb21tYW5kSWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLmNvbW1hbmQuQXhpczJURENvbW1hbmQiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpczIuY3JlYXRpb24udWkud3NydC5BeGlzMlNrZWxDb25maWdXaWRnZXRGYWN0b3J5IiAvPgotICAgIDwvZXh0ZW5zaW9uPiAKLSAgICAKLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkucnVudGltZXMiPgotICAgICAgPHJ1bnRpbWUKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5heGlzMldlYlNlcnZpY2VSVCIKLSAgICAgICAgbGFiZWw9IiVMQUJFTF9SVU5USU1FX0FYSVNfMiIKLSAgICAgICAgc2VydmVyUmVxdWlyZWQ9ImZhbHNlIi8+Ci0gICAgPC9leHRlbnNpb24+Ci0KLQotCTwhLS0gZGVmaW5lIHN1cHBvcnQgZm9yIEF4aXMyIEphdmEgYmVhbiBib3R0b20gdXAgYW5kIHRvcC1kb3duIHN1cHBvcnQgaW4gd2ViIHByb2plY3RzIC0tPgotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5zZXJ2aWNlUnVudGltZXMiPgotICAgICAgPHNlcnZpY2VSdW50aW1lCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uamF2YSIgCi0gICAgICAgIHNlcnZpY2VJbXBsZW1lbnRhdGlvblR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LndzLndzSW1wbC5qYXZhIgotICAgICAgICBydW50aW1lSWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5heGlzMldlYlNlcnZpY2VSVCIKLSAgICAgICAgYm90dG9tVXA9InRydWUiCi0gICAgICAgIHRvcERvd249InRydWUiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpczIuY3JlYXRpb24udWkud3NydC5BeGlzMldlYlNlcnZpY2VSdW50aW1lIj4KLQotICAgICAgICA8cmVxdWlyZWQtZmFjZXQtdmVyc2lvbiBmYWNldD0ianN0LndlYiIgdmVyc2lvbj0iMi4zIiBhbGxvdy1uZXdlcj0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWQtZmFjZXQtdmVyc2lvbiBmYWNldD0iYXhpczIuY29yZSIgdmVyc2lvbj0iMS4xIiBhbGxvdy1uZXdlcj0idHJ1ZSIgLz4KLSAgICAgICAgPHJlcXVpcmVkLWZhY2V0LXZlcnNpb24gZmFjZXQ9ImF4aXMyLmV4dCIgdmVyc2lvbj0iMS4xIiBhbGxvdy1uZXdlcj0idHJ1ZSIgLz4KLQotICAgICAgPC9zZXJ2aWNlUnVudGltZT4KLSAgICA8L2V4dGVuc2lvbj4gICAKLSAgICAgICAgCi0gICAgPCEtLSBkZWZpbmUgc3VwcG9ydCBmb3IgQXhpcyBKYXZhIGNsaWVudHMgaW4gV2ViIHByb2plY3RzIC0tPgotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5jbGllbnRSdW50aW1lcyI+Ci0gICAgICA8Y2xpZW50UnVudGltZQotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvbnN1bXB0aW9uLndlYiIKLSAgICAgICAgY2xpZW50SW1wbGVtZW50YXRpb25UeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jbGllbnQudHlwZS5qYXZhIgotICAgICAgICBydW50aW1lSWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5heGlzMldlYlNlcnZpY2VSVCIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzMi5jcmVhdGlvbi51aS53c3J0LkF4aXMyV2ViU2VydmljZVJ1bnRpbWUiPgotCi0gICAgICAgIDxyZXF1aXJlZC1mYWNldC12ZXJzaW9uIGZhY2V0PSJqc3Qud2ViIiB2ZXJzaW9uPSIyLjMiIGFsbG93LW5ld2VyPSJ0cnVlIiAvPgotICAgICAgICA8cmVxdWlyZWQtZmFjZXQtdmVyc2lvbiBmYWNldD0iYXhpczIuY29yZSIgdmVyc2lvbj0iMS4xIiBhbGxvdy1uZXdlcj0idHJ1ZSIgLz4KLSAgICAgICAgPHJlcXVpcmVkLWZhY2V0LXZlcnNpb24gZmFjZXQ9ImF4aXMyLmV4dCIgdmVyc2lvbj0iMS4xIiBhbGxvdy1uZXdlcj0idHJ1ZSIgLz4KLQotICAgICAgPC9jbGllbnRSdW50aW1lPgotICAgIDwvZXh0ZW5zaW9uPiAgICAgCi0gICAgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpczIvY3JlYXRpb24vdWkvcGx1Z2luL1dlYlNlcnZpY2VBeGlzMkNyZWF0aW9uVUlQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpczIvY3JlYXRpb24vdWkvcGx1Z2luL1dlYlNlcnZpY2VBeGlzMkNyZWF0aW9uVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWViZTZmNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMyL2NyZWF0aW9uL3VpL3BsdWdpbi9XZWJTZXJ2aWNlQXhpczJDcmVhdGlvblVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAxMTAgICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgQXhpczIgCi0gKiAJCQkJCQkJCQkJICBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzMi5jcmVhdGlvbi51aS5wbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VBeGlzMkNyZWF0aW9uVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aSI7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgV2ViU2VydmljZUF4aXMyQ3JlYXRpb25VSVBsdWdpbiBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIFdlYlNlcnZpY2VBeGlzMkNyZWF0aW9uVUlQbHVnaW4oKSB7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgV2ViU2VydmljZUF4aXMyQ3JlYXRpb25VSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzMi9jcmVhdGlvbi91aS93aWRnZXRzL2JlYW4vU2VydmljZXNYTUxTZWxlY3RCZWFuV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMyL2NyZWF0aW9uL3VpL3dpZGdldHMvYmVhbi9TZXJ2aWNlc1hNTFNlbGVjdEJlYW5XaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkwOWU1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMyL2NyZWF0aW9uL3VpL3dpZGdldHMvYmVhbi9TZXJ2aWNlc1hNTFNlbGVjdEJlYW5XaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAxMTAgICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgQXhpczIgCi0gKiAJCQkJCQkJCQkJICBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotICogMjAwNzA1MTMgICAxODY0MzAgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgZml4IGZvciAxODY0MzAKLSAqCQkJCQkJCQkJCSAgVGV4dCBub3QgYWNjZXNzaWJsZSBvbiBBWElTMiB3aXphcmQgcGFnZXMuCi0gKiAyMDA3MDUyOSAgIDE4ODc0MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBmaXggZm9yIDE4ODc0MgotICogMjAwNzA4MjQgICAyMDA1MTUgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgTk9OLU5MUyBtb3ZlIHRvIHNlcGVyYXRlIGZpbGUKLSAqIDIwMDcxMDMwCSAgMjA3NjIxIHppbmFAY2EuaWJtLmNvbSAtIFppbmEgTW9zdGFmaWEsIFBhZ2UgR1VJIHNlcXVlbmNlIHVzaW5nIHRhYiBpcyBub3QgY29ycmVjdCAoIHZpb2xhdGVzIEFjY2Vzc2liaWxpdHkpCi0gKiAyMDA4MDYwNCAgIDE5MzM3MSBzYW1pbmRhd0B3c28yLmNvbSAtIFNhbWluZGEgV2lqZXJhdG5lLCAgYnJvd3Npbmcgb25seSB4bWwgZmlsZXMgaW4gdGhlIHdvcmtzcGFjZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzMi5jcmVhdGlvbi51aS53aWRnZXRzLmJlYW47Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS51dGlscy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLmRhdGEuRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLm1lc3NhZ2VzLkF4aXMyQ3JlYXRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzMi5jb25zdW1wdGlvbi51aS5wbHVnaW4uV2ViU2VydmljZUF4aXMyQ29uc3VtcHRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuY29tbW9uLlVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotCi0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlc1hNTFNlbGVjdEJlYW5XaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IgCi17Ci0JcHJpdmF0ZSBEYXRhTW9kZWwgCW1vZGVsOwotCXByaXZhdGUgQnV0dG9uCSAJYnJvd3NlQnV0dG9uOwotCXByaXZhdGUgVGV4dCAJCXNlcnZpY2VzWE1MUGF0aDsKLQlwcml2YXRlIEJ1dHRvbiAJCWdlbmVyYXRlU2VydmljZXNYTUw7Ci0JcHJpdmF0ZSBCdXR0b24gCQloYXZlU2VydmljZXNYTUw7Ci0KLQlwdWJsaWMgU2VydmljZXNYTUxTZWxlY3RCZWFuV2lkZ2V0KCBEYXRhTW9kZWwgbW9kZWwgKQotCXsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOyAgCi0JfQotCi0JcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyICkKLQl7Ci0JCVVJVXRpbHMgdWlVdGlscyA9IG5ldyBVSVV0aWxzKFdlYlNlcnZpY2VBeGlzMkNvbnN1bXB0aW9uVUlQbHVnaW4uUExVR0lOX0lEKTsKLQkJCi0JCVRleHQgbGFiZWwgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotCQlsYWJlbC5zZXRUZXh0KCBBeGlzMkNyZWF0aW9uVUlNZXNzYWdlcy5MQUJFTF9BWElTMl9QUkVGRVJFTkNFX1BBR0UgKTsKLQkJCi0JCW1vZGVsLnNldEdlbmVyYXRlU2VydmljZXNYTUwodHJ1ZSk7Ci0JCW1vZGVsLnNldFNlcnZpY2VzWE1MKGZhbHNlKTsKLQotCQlmaW5hbCBDb21wb3NpdGUgcmFkaW9Db21wID0gdWlVdGlscy5jcmVhdGVDb21wb3NpdGUocGFyZW50LCAxKTsKLQkJCi0JCWhhdmVTZXJ2aWNlc1hNTCA9IHVpVXRpbHMuY3JlYXRlUmFkaW9CdXR0b24ocmFkaW9Db21wLCAKLQkJCQlBeGlzMkNyZWF0aW9uVUlNZXNzYWdlcy5MQUJFTF9IQVZFX1NFUlZJQ0VTX1hNTF9GSUxFLCBudWxsLCBudWxsICk7Ci0JCWhhdmVTZXJ2aWNlc1hNTC5hZGRTZWxlY3Rpb25MaXN0ZW5lciggbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotCQl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCQkJewotCQkJCWlmIChoYXZlU2VydmljZXNYTUwuZ2V0U2VsZWN0aW9uKCkpewotCQkJCQloYXZlU2VydmljZXNYTUwuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCQlnZW5lcmF0ZVNlcnZpY2VzWE1MLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJCWVuYWJsZVNlcnZpY2VzWE1MQnJvd3NlKCk7Ci0JCQkJfWVsc2V7Ci0JCQkJCWlmICghZ2VuZXJhdGVTZXJ2aWNlc1hNTC5nZXRTZWxlY3Rpb24oKSl7Ci0JCQkJCQloYXZlU2VydmljZXNYTUwuc2V0U2VsZWN0aW9uKHRydWUpOyAKLQkJCQkJCWdlbmVyYXRlU2VydmljZXNYTUwuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCQkJCWVuYWJsZVNlcnZpY2VzWE1MQnJvd3NlKCk7Ci0JCQkJCX1lbHNlewotCQkJCQkJaGF2ZVNlcnZpY2VzWE1MLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJCQlkaXNhYmxlU2VydmljZXNYTUxCcm93c2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQltb2RlbC5zZXRHZW5lcmF0ZVNlcnZpY2VzWE1MKGZhbHNlKTsKLQkJCQltb2RlbC5zZXRTZXJ2aWNlc1hNTCh0cnVlKTsKLQotCQkJCS8vIE5lZWQgdG8gdHJpZ2dlciBhIHZhbGlkYXRpb24gYXQgdGhpcyBwb2ludCB0byBlbnN1cmUKLQkJCQkvLyB0aGF0IHRoZSBuZXh0IGJ1dHRvbiBpcyBlbmFibGVkIHByb3Blcmx5IGp1c3QgaW4gY2FzZQotCQkJCS8vIHRoaXMgaXMgdGhlIGxhc3QgcGFnZSBpbiB0aGUgd2l6YXJkLgotCQkJCXN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KCBudWxsICk7Ci0JCQl9ICAgICAKLQkJfSk7Ci0JCQotCQlmaW5hbCBDb21wb3NpdGUgcGF0aENvbXAgPSB1aVV0aWxzLmNyZWF0ZUNvbXBvc2l0ZShyYWRpb0NvbXAsIDMpOwotCQlzZXJ2aWNlc1hNTFBhdGggPSB1aVV0aWxzLmNyZWF0ZVRleHQocGF0aENvbXAsICIiLCBudWxsLCBudWxsLCBTV1QuQk9SREVSICk7Ci0JCXNlcnZpY2VzWE1MUGF0aC5hZGRNb2RpZnlMaXN0ZW5lciggbmV3IE1vZGlmeUxpc3RlbmVyKCkKLQkJewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKQotCQkJewotCQkJCW1vZGVsLnNldFBhdGhUb1NlcnZpY2VzWE1MKCBzZXJ2aWNlc1hNTFBhdGguZ2V0VGV4dCgpICk7Ci0JCQkJLy8gTmVlZCB0byB0cmlnZ2VyIGEgdmFsaWRhdGlvbiBhdCB0aGlzIHBvaW50IHRvIGVuc3VyZQotCQkJCS8vIHRoYXQgdGhlIG5leHQgYnV0dG9uIGlzIGVuYWJsZWQgcHJvcGVybHkganVzdCBpbiBjYXNlCi0JCQkJLy8gdGhpcyBpcyB0aGUgbGFzdCBwYWdlIGluIHRoZSB3aXphcmQuCi0JCQkJc3RhdHVzTGlzdGVuZXIuaGFuZGxlRXZlbnQoIG51bGwgKTsKLQkJCX0KLQkJfSk7Ci0KLQkJCi0JCWJyb3dzZUJ1dHRvbiA9IHVpVXRpbHMuY3JlYXRlUHVzaEJ1dHRvbihwYXRoQ29tcCwgCi0JCQkJQXhpczJDcmVhdGlvblVJTWVzc2FnZXMuTEFCRUxfQlJPV1NFLCBudWxsLCBudWxsICk7Ci0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciggbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotCQl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotCQkJewotCQkJCWhhbmRsZUJyb3dzZShwYXRoQ29tcC5nZXRTaGVsbCgpKTsKLQkJCQkvLyBOZWVkIHRvIHRyaWdnZXIgYSB2YWxpZGF0aW9uIGF0IHRoaXMgcG9pbnQgdG8gZW5zdXJlCi0JCQkJLy8gdGhhdCB0aGUgbmV4dCBidXR0b24gaXMgZW5hYmxlZCBwcm9wZXJseSBqdXN0IGluIGNhc2UKLQkJCQkvLyB0aGlzIGlzIHRoZSBsYXN0IHBhZ2UgaW4gdGhlIHdpemFyZC4KLQkJCQlzdGF0dXNMaXN0ZW5lci5oYW5kbGVFdmVudCggbnVsbCApOwotCQkJfSAgICAgCi0JCX0pOyAKLQotCi0JCWdlbmVyYXRlU2VydmljZXNYTUwgPSB1aVV0aWxzLmNyZWF0ZVJhZGlvQnV0dG9uKHJhZGlvQ29tcCwgCi0JCQkJQXhpczJDcmVhdGlvblVJTWVzc2FnZXMuTEFCRUxfREVGQVVMVF9TRVJWSUNFU19YTUxfRklMRSwgbnVsbCwgbnVsbCk7Ci0JCWdlbmVyYXRlU2VydmljZXNYTUwuc2V0U2VsZWN0aW9uKHRydWUpOwotCQlnZW5lcmF0ZVNlcnZpY2VzWE1MLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0JCXsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0JCQl7Ci0JCQkJaWYgKGdlbmVyYXRlU2VydmljZXNYTUwuZ2V0U2VsZWN0aW9uKCkpewotCQkJCQlnZW5lcmF0ZVNlcnZpY2VzWE1MLnNldFNlbGVjdGlvbih0cnVlKTsgCi0JCQkJCWhhdmVTZXJ2aWNlc1hNTC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCQlkaXNhYmxlU2VydmljZXNYTUxCcm93c2UoKTsKLQkJCQl9ZWxzZXsKLQkJCQkJaWYgKCFoYXZlU2VydmljZXNYTUwuZ2V0U2VsZWN0aW9uKCkpewotCQkJCQkJZ2VuZXJhdGVTZXJ2aWNlc1hNTC5zZXRTZWxlY3Rpb24odHJ1ZSk7IAotCQkJCQkJaGF2ZVNlcnZpY2VzWE1MLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJCX1lbHNlewotCQkJCQkJZ2VuZXJhdGVTZXJ2aWNlc1hNTC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJCW1vZGVsLnNldEdlbmVyYXRlU2VydmljZXNYTUwodHJ1ZSk7Ci0JCQkJbW9kZWwuc2V0U2VydmljZXNYTUwoZmFsc2UpOwotCQkJCS8vIE5lZWQgdG8gdHJpZ2dlciBhIHZhbGlkYXRpb24gYXQgdGhpcyBwb2ludCB0byBlbnN1cmUKLQkJCQkvLyB0aGF0IHRoZSBuZXh0IGJ1dHRvbiBpcyBlbmFibGVkIHByb3Blcmx5IGp1c3QgaW4gY2FzZQotCQkJCS8vIHRoaXMgaXMgdGhlIGxhc3QgcGFnZSBpbiB0aGUgd2l6YXJkLgotCQkJCXN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KCBudWxsICk7Ci0JCQl9ICAgICAKLQkJfSk7IAotCi0JCWRpc2FibGVTZXJ2aWNlc1hNTEJyb3dzZSgpOwotCi0JCXJldHVybiB0aGlzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yI2dldFN0YXR1cygpCi0JICovCi0JcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkgCi0JewotCQlJU3RhdHVzIHJlc3VsdCA9IG51bGw7Ci0JCVN0cmluZyBzZXJ2aWNlWE1MUGF0aExvY2F0aW9uID0gc2VydmljZXNYTUxQYXRoLmdldFRleHQoKTsKLQkJCQlpZiAoaGF2ZVNlcnZpY2VzWE1MLmdldFNlbGVjdGlvbigpCi0JCQkJCQkmJiAoc2VydmljZVhNTFBhdGhMb2NhdGlvbi5lcXVhbHMoIiIpIAotCQkJCQkJCQl8fCAhKG5ldyBGaWxlKHNlcnZpY2VYTUxQYXRoTG9jYXRpb24pLmV4aXN0cygpKSkpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCAiaWQiLCAwLAotCQkJCQkJCUF4aXMyQ3JlYXRpb25VSU1lc3NhZ2VzLkVSUk9SX0lOVkFMSURfU0VSVklDRVNfWE1MLAotCQkJCQkJCW51bGwpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBlbmFibGUgdGhlIHNlcnZpY2VzLnhtbCB0ZXh0IGFuZCBicm93c2UgYnV0dG9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGVuYWJsZVNlcnZpY2VzWE1MQnJvd3NlKCl7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQlzZXJ2aWNlc1hNTFBhdGguc2V0RW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBkaXNhYmxlIHRoZSBzZXJ2aWNlcy54bWwgdGV4dCBhbmQgYnJvd3NlIGJ1dHRvbgotCSAqLwotCXByaXZhdGUgdm9pZCBkaXNhYmxlU2VydmljZXNYTUxCcm93c2UoKXsKLQkJYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlzZXJ2aWNlc1hNTFBhdGguc2V0RW5hYmxlZChmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogUG9wcyB1cCB0aGUgZmlsZSBicm93c2UgZGlhbG9nIGJveAotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVCcm93c2UoU2hlbGwgcGFyZW50KSB7Ci0JCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlGaWxlRXh0ZW5zaW9uRmlsdGVyIGZpbGVFeHRlbnNpb25GaWx0ZXIgPSBuZXcgRmlsZUV4dGVuc2lvbkZpbHRlcihuZXcgU3RyaW5nW10geyJ4bWwifSk7Ci0JCURpYWxvZ1Jlc291cmNlQnJvd3NlciBkaWFsb2cgPSBuZXcgRGlhbG9nUmVzb3VyY2VCcm93c2VyKAotCQkJCXBhcmVudC5nZXRTaGVsbCgpLCByb290LCBmaWxlRXh0ZW5zaW9uRmlsdGVyKTsKLQkJYm9vbGVhbiBpc1Nob3dEaWFsb2cgPSB0cnVlOwotCQl3aGlsZSAoaXNTaG93RGlhbG9nKXsKLQkJCWlmIChkaWFsb2cub3BlbigpID09IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cuQ0FOQ0VMKXsKLQkJCQlicmVhazsKLQkJCX0KLQkJCUlSZXNvdXJjZSByZXMgPSBkaWFsb2cuZ2V0Rmlyc3RTZWxlY3Rpb24oKTsKLQkJCWlmKCByZXMgIT0gbnVsbCApCi0JCQl7Ci0JCQkJU3RyaW5nIGZpbGVMb2NhdGlvbiA9IHJlcy5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKLQkJCQkKLQkJCQkvL3NpbmNlIHRoZSB4bWwgZmlsZSBleGlzdCBub3cgY2hlY2sgd2hldGhlciBpdCBpcyBhIHZhbGlkIHNlcnZpY2VzLnhzZCBmaWxlIAotCQkJCWlmIChTZXJ2aWNlc1hNTFV0aWxzLmlzU2VydmljZXNYTUxWYWxpZChmaWxlTG9jYXRpb24pKXsKLQkJCQkJc2VydmljZXNYTUxQYXRoLnNldFRleHQoZmlsZUxvY2F0aW9uKTsKLQkJCQkJbW9kZWwuc2V0UGF0aFRvU2VydmljZXNYTUwoZmlsZUxvY2F0aW9uKTsKLQkJCQkJaXNTaG93RGlhbG9nID0gZmFsc2U7Ci0JCQkJfWVsc2V7Ci0JCQkJCU1lc3NhZ2VCb3ggbWVzc2FnZUJveCA9IG5ldyBNZXNzYWdlQm94KHBhcmVudCxTV1QuT0spOwotCQkJCQltZXNzYWdlQm94LnNldE1lc3NhZ2UoQXhpczJDcmVhdGlvblVJTWVzc2FnZXMuRVJST1JfSU5WQUxJRF9TRVJWSUNFU19YTUwpOwotCQkJCQltZXNzYWdlQm94Lm9wZW4oKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMyL2NyZWF0aW9uL3VpL3dpZGdldHMvc2tlbGV0b24vV1NETDJKQVZBU2tlbENvbmZpZ1dpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzMi9jcmVhdGlvbi91aS93aWRnZXRzL3NrZWxldG9uL1dTREwySkFWQVNrZWxDb25maWdXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I0NWYwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMyL2NyZWF0aW9uL3VpL3dpZGdldHMvc2tlbGV0b24vV1NETDJKQVZBU2tlbENvbmZpZ1dpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDExMCAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiAKLSAqIAkJCQkJCQkJCQkgIHJ1bnRpbWUgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzYyCi0gKiAyMDA3MDQyNSAgIDE4MzA0NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKiAyMDA3MDUxOCAgIDE4NzMxMSBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBGaXhpbmcgdGVzdCByZXNvdXJjZSBhZGRpdGlvbgotICogMjAwNzA1MjMgICAxNzQ4NzYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgUGVyc2lzdCBQcmVmZXJlbmNlcyBpbnNpZGUgRnJhbWV3b3JrCi0gKiAyMDA3MDgyMyAgIDIwMDQxMyBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBOYW1lc3BhY2UgdG8gUGFja2FnZSB0YWJsZSBmaXgKLSAqIDIwMDcwODI0ICAgMjAwNTE1IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIE5PTi1OTFMgbW92ZSB0byBzZXBlcmF0ZSBmaWxlCi0gKiAyMDA4MDMxOSAgIDIwNzYxNiBtYWthbmRyZUBjYS5pYm0uY29tIC0gQW5kcmV3IE1haywgVGFibGUgaW4gQXhpczIgV2ViIFNlcnZpY2UgU2tlbGV0b24gSmF2YSBCZWFuIENvbmZpZ3VyYXRpb24gUGFnZSBub3QgQWNjZXNzaWJsZQotICogMjAwODA2MjEgICAyMDAwNjkgc2FtaW5kYXdAd3NvMi5jb20gLSBTYW1pbmRhIFdpamVyYXRuZSwgc2F2aW5nIHRoZSByZXRyaWV2ZWQgV1NETCBzbyBubyBuZWVkIHRvIHJldHJpZXZlIGl0IGFnYWluCi0gKiAyMDA5MDMwNyAgIDE5Njk1NCBzYW1pbmRhd0B3c28yLmNvbSAtIFNhbWluZGEgV2lqZXJhdG5lLCBTdXBwb3J0IFhNTEJlYW5zIGRhdGEgYmluZGluZwotICogMjAwOTEyMDcgICAxOTM5OTYgc2FtaW5kYXdAd3NvMi5jb20gLSBTYW1pbmRhIFdpamVyYXRuZSwgc2VsZWN0aW5nIGEgc3BlY2lmaWMgc2VydmljZS9wb3J0bmFtZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzMi5jcmVhdGlvbi51aS53aWRnZXRzLnNrZWxldG9uOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jb25zdW1wdGlvbi5jb3JlLnV0aWxzLldTRExQcm9wZXJ0eVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb25zdGFudC5BeGlzMkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb250ZXh0LkF4aXMyRW1pdHRlckNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUucGx1Z2luLldlYlNlcnZpY2VBeGlzMkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUudXRpbHMuQ2xhc3NMb2FkaW5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS5kYXRhLkRhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS5tZXNzYWdlcy5BeGlzMkNyZWF0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotCi0KLXB1YmxpYyBjbGFzcyBXU0RMMkpBVkFTa2VsQ29uZmlnV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yIAotewotCXByaXZhdGUgRGF0YU1vZGVsIG1vZGVsOwotCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQotCS8vY29udHJvbHMKLQkvL2NoZWNrIGJveCBmb3Igc2VydmVyIHNpZGUgaW50ZXJmYWNlCi0JcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVTZXJ2ZXJTaWRlSW50ZXJmYWNlQ2hlY2tCb3hCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVBbGxDaGVja0JveEJ1dHRvbjsKLQlwcml2YXRlIENvbWJvIGRhdGFiaW5kaW5nVHlwZUNvbWJvOwotCS8vIFRleHQgYm94IHRvIGhhdmUgdGhlIHBvcnRuYW1lCi0JcHJpdmF0ZSBDb21ibyBwb3J0TmFtZUNvbWJvOwotCS8vVGV4dCBib3ggdG8gaGF2ZSB0aGUgc2VydmljZSBuYW1lCi0JcHJpdmF0ZSBDb21ibyBzZXJ2aWNlTmFtZUNvbWJvOwotCXByaXZhdGUgV1NETFByb3BlcnR5UmVhZGVyIHJlYWRlcjsKLQlwcml2YXRlIGphdmEudXRpbC5MaXN0IHNlcnZpY2VRTmFtZUxpc3QgPSBudWxsOwotCXByaXZhdGUgVGFibGUgbmFtZXNwYWNlMnBhY2thZ2VUYWJsZSA9IG51bGw7Ci0JLy9MYWJlbCBob2xkaW5nIHRoZSBmdWxsIHF1YWxpZmllZCBwYWNrYWdlIG5hbWUgZm9yIGdlbmVyYXRlZCBjb2RlCi0JcHJpdmF0ZSBUZXh0IHBhY2thZ2VUZXh0OwotCS8vQ2hlY2tib3ggdG8gZW5hYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRlc3QgY2FzZSBjbGFzc2VzIAotCS8vIGZvciB0aGUgZ2VuZXJhdGVkIGltcGxlbWVudGF0aW9uIG9mIHRoZSB3ZWJzZXJ2aWNlLgotCUxhYmVsICAgICAgbGFiZWwsIGZpbGxMYWJlbCwgZmlsbExhYmVsMSwgZmlsbExhYmVsMiwgZmlsbExhYmVsMywgZmlsbExhYmVsNCwgZmlsbExhYmVsNSwgZmlsbExhYmVsNjsKLQlBeGlzMkVtaXR0ZXJDb250ZXh0IGNvbnRleHQ7Ci0KLQlwdWJsaWMgV1NETDJKQVZBU2tlbENvbmZpZ1dpZGdldCggRGF0YU1vZGVsIG1vZGVsICkJewotCQljb250ZXh0ID0gV2ViU2VydmljZUF4aXMyQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QXhpc0VtaXR0ZXJDb250ZXh0KCk7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsgIAotCX0KLQotCXB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKCBDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lciApewotCQlDb21wb3NpdGUgIG1haW5Db21wID0gbmV3IENvbXBvc2l0ZSggcGFyZW50LCBTV1QuTk9ORSApOwotCQlHcmlkTGF5b3V0IGxheW91dCAgID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbWFpbkNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQltYWluQ29tcC5zZXRMYXlvdXREYXRhKCBnZCApOwotCi0JCS8vIHNlcnZpY2UgbmFtZQotCQlsYWJlbCA9IG5ldyBMYWJlbChtYWluQ29tcCwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KEF4aXMyQ3JlYXRpb25VSU1lc3NhZ2VzLkxBQkVMX1NFUlZJQ0VfTkFNRV9DQVBUSU9OKTsKLQotCQlzZXJ2aWNlTmFtZUNvbWJvID0gbmV3IENvbWJvKG1haW5Db21wLCBTV1QuRFJPUF9ET1dOIHwgU1dULkJPUkRFUgotCQkJCXwgU1dULlJFQURfT05MWSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJc2VydmljZU5hbWVDb21iby5zZXRMYXlvdXREYXRhKGdkKTsKLQkJc2VydmljZU5hbWVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaW50IHNlbGVjdGlvbkluZGV4ID0gc2VydmljZU5hbWVDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJCWlmIChzZWxlY3Rpb25JbmRleCAhPSAtMSkgewotCQkJCQlPYmplY3Qgb2JqZWN0ID0gcmVhZGVyLmdldFNlcnZpY2VMaXN0KCkuZ2V0KHNlbGVjdGlvbkluZGV4KTsKLQkJCQkJbW9kZWwuc2V0U2VydmljZVFOYW1lKG9iamVjdCk7Ci0JCQkJfQotCQkJCWxvYWRQb3J0TmFtZXMoKTsKLQkJCQlwb3B1bGF0ZVBhY2thZ2VOYW1lKCk7Ci0JCQkJbG9hZE5hbWVzcGFjZXMocmVhZGVyLmdldERlZmluaXRpb25OYW1lc3BhY2VNYXAoKSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQkvLyBwb3J0IG5hbWUKLQkJbGFiZWwgPSBuZXcgTGFiZWwobWFpbkNvbXAsIFNXVC5OVUxMKTsKLQkJbGFiZWwuc2V0VGV4dChBeGlzMkNyZWF0aW9uVUlNZXNzYWdlcy5MQUJFTF9QT1JUTkFNRSk7Ci0JCXBvcnROYW1lQ29tYm8gPSBuZXcgQ29tYm8obWFpbkNvbXAsIFNXVC5EUk9QX0RPV04gfCBTV1QuQk9SREVSCi0JCQkJfCBTV1QuUkVBRF9PTkxZKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlwb3J0TmFtZUNvbWJvLnNldExheW91dERhdGEoZ2QpOwotCQlwb3J0TmFtZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQltb2RlbC5zZXRQb3J0TmFtZShwb3J0TmFtZUNvbWJvLmdldFRleHQoKSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQkvLyBEYXRhYmluZGluZwotCQlsYWJlbCA9IG5ldyBMYWJlbChtYWluQ29tcCwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KEF4aXMyQ3JlYXRpb25VSU1lc3NhZ2VzLkxBQkVMX0RBVEFCSU5ESU5HX0NBUFRJT04pOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRhdGFiaW5kaW5nVHlwZUNvbWJvID0gbmV3IENvbWJvKG1haW5Db21wLCBTV1QuRFJPUF9ET1dOIHwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQlkYXRhYmluZGluZ1R5cGVDb21iby5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZmlsbERhdGFiaW5kZXJDb21ibygpOwotCQlkYXRhYmluZGluZ1R5cGVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJbW9kZWwuc2V0RGF0YWJpbmRpbmdUeXBlKGRhdGFiaW5kaW5nVHlwZUNvbWJvLmdldFRleHQoKSk7Ci0JCQl9OwotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX07Ci0JCX0pOwotCi0JCS8vIHBhY2thZ2UgbmFtZQotCQlsYWJlbCA9IG5ldyBMYWJlbChtYWluQ29tcCwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KEF4aXMyQ3JlYXRpb25VSU1lc3NhZ2VzLkxBQkVMX1BBQ0tFR0VfTkFNRSk7Ci0JCXBhY2thZ2VUZXh0ID0gbmV3IFRleHQobWFpbkNvbXAsIFNXVC5CT1JERVIpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLQkJcGFja2FnZVRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXBhY2thZ2VUZXh0LnNldFRleHQoIiIpOyAvLyBnZXQgdGhpcyB0ZXh0IGZyb20gdGhlCi0JCXBhY2thZ2VUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCW1vZGVsLnNldFBhY2thZ2VUZXh0KHBhY2thZ2VUZXh0LmdldFRleHQoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vZmlsbGluZyBsYWJlbCAKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlmaWxsTGFiZWwgPSBuZXcgTGFiZWwobWFpbkNvbXAsIFNXVC5IT1JJWk9OVEFMIHwgU1dULk5VTEwpOwotCi0JCS8vZmlsbGluZyBsYWJlbCAKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlmaWxsTGFiZWwyID0gbmV3IExhYmVsKG1haW5Db21wLCBTV1QuSE9SSVpPTlRBTCB8IFNXVC5OVUxMKTsKLQotCQkvL2ZpbGxpbmcgbGFiZWwgCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJZmlsbExhYmVsMyA9IG5ldyBMYWJlbChtYWluQ29tcCwgU1dULkhPUklaT05UQUwgfCBTV1QuTlVMTCk7Ci0KLQkJLy9maWxsaW5nIGxhYmVsIAotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWZpbGxMYWJlbDQgPSBuZXcgTGFiZWwobWFpbkNvbXAsIFNXVC5IT1JJWk9OVEFMIHwgU1dULk5VTEwpOwotCi0JCW1vZGVsLnNldFNlcnZlclhNTENoZWNrKHRydWUpOwotCi0JCS8vdGhlIHNlcnZlciBzaWRlIGludGVyZmFjZSBvcHRpb24KLQkJZ2VuZXJhdGVTZXJ2ZXJTaWRlSW50ZXJmYWNlQ2hlY2tCb3hCdXR0b24gPSBuZXcgQnV0dG9uKG1haW5Db21wLCBTV1QuQ0hFQ0spOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWdlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZUNoZWNrQm94QnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlnZW5lcmF0ZVNlcnZlclNpZGVJbnRlcmZhY2VDaGVja0JveEJ1dHRvbgotCQkJCQkJCS5zZXRTZWxlY3Rpb24oY29udGV4dC5pc1NlcnZpY2VJbnRlcmZhY2VTa2VsZXRvbigpKTsKLQkJZ2VuZXJhdGVTZXJ2ZXJTaWRlSW50ZXJmYWNlQ2hlY2tCb3hCdXR0b24uc2V0VGV4dChBeGlzMkNyZWF0aW9uVUlNZXNzYWdlcy4KLQkJCQkJCQkJCQkJCQkJICBMQUJFTF9HRU5FUkFURV9TRVJWRVJTSURFX0lOVEVSRkFDRSk7Ci0JCW1vZGVsLnNldEdlbmVyYXRlQWxsQ2hlY2soY29udGV4dC5pc1NlcnZpY2VJbnRlcmZhY2VTa2VsZXRvbigpKTsKLQkJZ2VuZXJhdGVTZXJ2ZXJTaWRlSW50ZXJmYWNlQ2hlY2tCb3hCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW1vZGVsLnNldEdlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZSgKLQkJCQkJCWdlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZUNoZWNrQm94QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGdlbmVyYXRlIGFsbAotCQlnZW5lcmF0ZUFsbENoZWNrQm94QnV0dG9uID0gbmV3IEJ1dHRvbihtYWluQ29tcCwgU1dULkNIRUNLKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlnZW5lcmF0ZUFsbENoZWNrQm94QnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlnZW5lcmF0ZUFsbENoZWNrQm94QnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzU2VydmljZUdlbmVyYXRlQWxsKCkpOwotCQlnZW5lcmF0ZUFsbENoZWNrQm94QnV0dG9uLnNldFRleHQoQXhpczJDcmVhdGlvblVJTWVzc2FnZXMuTEFCRUxfR0VORVJBVEVfQUxMKTsKLQkJZ2VuZXJhdGVBbGxDaGVja0JveEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJbW9kZWwuc2V0R2VuZXJhdGVBbGxDaGVjayhnZW5lcmF0ZUFsbENoZWNrQm94QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLy9maWxsaW5nIGxhYmVsIAotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWZpbGxMYWJlbDUgPSBuZXcgTGFiZWwobWFpbkNvbXAsIFNXVC5IT1JJWk9OVEFMIHwgU1dULk5VTEwpOwotCi0JCS8vZmlsbGluZyBsYWJlbCAKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlmaWxsTGFiZWw2ID0gbmV3IExhYmVsKG1haW5Db21wLCBTV1QuSE9SSVpPTlRBTCB8IFNXVC5OVUxMKTsKLQkJCi0JCS8vYWRkIGEgdGFibGUgdG8gc2V0IG5hbWVzcGFjZSB0byBwYWNrYWdlIG1hcHBpbmcKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBnZC52ZXJ0aWNhbFNwYW4gPSA1OwotICAgICAgICAKLSAgICAgICAgbmFtZXNwYWNlMnBhY2thZ2VUYWJsZSA9IG5ldyBUYWJsZShtYWluQ29tcCxTV1QuQk9SREVSfFNXVC5GVUxMX1NFTEVDVElPTik7Ci0gICAgICAgIG5hbWVzcGFjZTJwYWNrYWdlVGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotICAgICAgICBuYW1lc3BhY2UycGFja2FnZVRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7IAotICAgICAgICBuYW1lc3BhY2UycGFja2FnZVRhYmxlLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIG5hbWVzcGFjZTJwYWNrYWdlVGFibGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgCi0gICAgICAgIGRlY2xhcmVDb2x1bW4obmFtZXNwYWNlMnBhY2thZ2VUYWJsZSwKLSAgICAgICAgCQkzNTAsIC8vYSBkZWZhdWx0IHdpZHRoIHVudGlsIHdlIGFkanVzdAotICAgICAgICAJCUF4aXMyQ3JlYXRpb25VSU1lc3NhZ2VzLkxBQkVMX05BTUVTUEFDRSk7Ci0gICAgICAgIGRlY2xhcmVDb2x1bW4obmFtZXNwYWNlMnBhY2thZ2VUYWJsZSwKLSAgICAgICAgCQkyMDAsLy9hIGRlZmF1bHQgd2lkdGggdW50aWwgd2UgYWRqdXN0Ci0gICAgICAgIAkJQXhpczJDcmVhdGlvblVJTWVzc2FnZXMuTEFCRUxfUEFDS0FHRSk7Ci0gICAgICAgIAotICAgICAgICBuYW1lc3BhY2UycGFja2FnZVRhYmxlLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgIAotICAgICAgICAvLyBhZGQgdGhlIHRhYmxlIGVkaXRvcgotICAgICAgICBmaW5hbCBUYWJsZUVkaXRvciBlZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IobmFtZXNwYWNlMnBhY2thZ2VUYWJsZSk7Ci0gICAgICAgIGVkaXRvci5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkxFRlQ7Ci0gICAgICAgIGVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0KLSAgICAgICAgbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5hZGRMaXN0ZW5lcihTV1QuTW91c2VEb3duLCBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgICAgICAgICBSZWN0YW5nbGUgY2xpZW50QXJlYSA9IG5hbWVzcGFjZTJwYWNrYWdlVGFibGUuZ2V0Q2xpZW50QXJlYSgpOwotICAgICAgICAgICAgICBQb2ludCBwdCA9IG5ldyBQb2ludChldmVudC54LCBldmVudC55KTsKLSAgICAgICAgICAgICAgaW50IGluZGV4ID0gbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5nZXRUb3BJbmRleCgpOwotICAgICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBuYW1lc3BhY2UycGFja2FnZVRhYmxlLmdldEl0ZW1Db3VudCgpKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiB2aXNpYmxlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgVGFibGVJdGVtIGl0ZW0gPSBuYW1lc3BhY2UycGFja2FnZVRhYmxlLmdldEl0ZW0oaW5kZXgpOwotICAgICAgICAgICAgICAgIFJlY3RhbmdsZSByZWN0ID0gaXRlbS5nZXRCb3VuZHMoMSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlY3QuY29udGFpbnMocHQpKSB7Ci0gICAgICAgICAgICAgICAgCWVkaXRDZWxsKGl0ZW0sIGVkaXRvcik7Ci0gICAgICAgICAgICAgICAgCXJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCF2aXNpYmxlICYmIHJlY3QuaW50ZXJzZWN0cyhjbGllbnRBcmVhKSkgewotICAgICAgICAgICAgICAgICAgICB2aXNpYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCF2aXNpYmxlKQotICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIG5hbWVzcGFjZTJwYWNrYWdlVGFibGUuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJaWYgKG5hbWVzcGFjZTJwYWNrYWdlVGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSAtMSkKLQkJCQkJbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5zZXRTZWxlY3Rpb24oMCk7Ci0JCQl9Ci0gICAgICAgIH0pOwotICAgICAgICAKLSAgICAgICAgbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLSAgICAgICAgCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotICAgICAgICAJCWlmIChlLmtleUNvZGUgIT0gMzIpCi0gICAgICAgIAkJCXJldHVybjsKLQkJCQkKLSAgICAgICAgCQlUYWJsZUl0ZW1bXSBpdGVtID0gbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoaXRlbS5sZW5ndGggIT0gMSkKLQkJCQkJcmV0dXJuOwotCQkJCQotCQkJCWVkaXRDZWxsKGl0ZW1bMF0sIGVkaXRvcik7Ci0JCQl9Ci0gICAgICAgIH0pOwotICAgICAgICAKLQkJcG9wdWxhdGVQYXJhbXNGcm9tV1NETCgpOwotCQlwb3B1bGF0ZU1vZGVsKCk7Ci0KLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVkaXRDZWxsKGZpbmFsIFRhYmxlSXRlbSBpdGVtLCBUYWJsZUVkaXRvciBlZGl0b3IpIHsKLQkJCi0JCWZpbmFsIFRleHQgdGV4dEVkaXQgPSBuZXcgVGV4dChuYW1lc3BhY2UycGFja2FnZVRhYmxlLCBTV1QuTk9ORSk7CQkKLQkJdGV4dEVkaXQuc2V0VGV4dChpdGVtLmdldFRleHQoMSkpOwkJCQkJCQotCQl0ZXh0RWRpdC5zZWxlY3RBbGwoKTsKLQkJdGV4dEVkaXQuc2V0Rm9jdXMoKTsKLQkJCi0JCXRleHRFZGl0LmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlpdGVtLnNldFRleHQoMSwgdGV4dEVkaXQuZ2V0VGV4dCgpKTsKLQkJCQl0ZXh0RWRpdC5kaXNwb3NlKCk7Ci0JCQl9CQkJCi0JCX0pOwotCQkKLQkJdGV4dEVkaXQuYWRkVHJhdmVyc2VMaXN0ZW5lcihuZXcgVHJhdmVyc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGtleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50IGUpIHsKLQkJCQlzd2l0Y2ggKGUuZGV0YWlsKSB7Ci0JCQkJCWNhc2UgU1dULlRSQVZFUlNFX1JFVFVSTjoKLQkJCQkJCWl0ZW0uc2V0VGV4dCgxLCB0ZXh0RWRpdC5nZXRUZXh0KCkpOwotCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9FU0NBUEU6Ci0JCQkJCQl0ZXh0RWRpdC5kaXNwb3NlKCk7Ci0JCQkJCQllLmRvaXQgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9CQkJCi0JCX0pOwotCQkKLQkJdGV4dEVkaXQuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCQlpZiAoZS5rZXlDb2RlID09IDMyKSB7Ci0JCQkJCWl0ZW0uc2V0VGV4dCgxLCB0ZXh0RWRpdC5nZXRUZXh0KCkpOwotCQkJCQl0ZXh0RWRpdC5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQkJCQotCQl9KTsKLQkJCi0JCXRleHRFZGl0LmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQltb2RlbC5zZXROYW1lc3Bhc2VUb1BhY2thZ2VNYXBwaW5nKGdldE5zMlBrZ01hcHBpbmcoKSk7CQkJCQotCQkJfQkJCQotCQl9KTsKLQkJCi0JCWVkaXRvci5zZXRFZGl0b3IodGV4dEVkaXQsIGl0ZW0sIDEpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZU1vZGVsKCkgewotCQlpbnQgc2VsZWN0aW9uSW5kZXggPSBzZXJ2aWNlTmFtZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChzZWxlY3Rpb25JbmRleCAhPSAtMSkgewotCQkJT2JqZWN0IG9iamVjdCA9IHJlYWRlci5nZXRTZXJ2aWNlTGlzdCgpLmdldChzZWxlY3Rpb25JbmRleCk7Ci0JCQltb2RlbC5zZXRTZXJ2aWNlUU5hbWUob2JqZWN0KTsKLQkJfQotCQltb2RlbC5zZXRQb3J0TmFtZShwb3J0TmFtZUNvbWJvLmdldFRleHQoKSk7Ci0JCW1vZGVsLnNldFBhY2thZ2VUZXh0KHBhY2thZ2VUZXh0LmdldFRleHQoKSk7Ci0JCW1vZGVsLnNldERhdGFiaW5kaW5nVHlwZShkYXRhYmluZGluZ1R5cGVDb21iby5nZXRUZXh0KCkpOwotCQltb2RlbC5zZXRHZW5lcmF0ZUFsbENoZWNrKGdlbmVyYXRlQWxsQ2hlY2tCb3hCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQltb2RlbC5zZXRHZW5lcmF0ZVNlcnZlclNpZGVJbnRlcmZhY2UoCi0JCQkJZ2VuZXJhdGVTZXJ2ZXJTaWRlSW50ZXJmYWNlQ2hlY2tCb3hCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQltb2RlbC5zZXROYW1lc3Bhc2VUb1BhY2thZ2VNYXBwaW5nKGdldE5zMlBrZ01hcHBpbmcoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3IjZ2V0U3RhdHVzKCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKSAKLQl7Ci0JCUlTdGF0dXMgcmVzdWx0ID0gbnVsbDsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVQYWNrYWdlTmFtZSgpIHsKLQkJdGhpcy5wYWNrYWdlVGV4dC5zZXRUZXh0KHJlYWRlci5wYWNrYWdlRnJvbVRhcmdldE5hbWVzcGFjZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBwb3B1bGF0ZSB0aGUgc2VydmljZSBhbmQgdGhlIHBvcnQgZnJvbSB0aGUgV1NETCB0aGlzIG5lZWRzIHRvIGJlIHB1YmxpYwotCSAqIHNpbmNlIHRoZSBXU0RMc2VsZWN0aW9uIHBhZ2UgbWF5IGNhbGwgdGhpcwotCSAqLwotCXB1YmxpYyB2b2lkIHBvcHVsYXRlUGFyYW1zRnJvbVdTREwoKSB7Ci0JCWlmIChyZWFkZXIgPT0gbnVsbCkKLQkJCXJlYWRlciA9IG5ldyBXU0RMUHJvcGVydHlSZWFkZXIobW9kZWwpOwotCQl0cnkgewotCQkJU3RyaW5nIGxuYW1lID0gbW9kZWwuZ2V0V3NkbFVSSSgpOwotCQkJaWYgKCEiIi5lcXVhbHMobG5hbWUudHJpbSgpKSkgewotCi0JCQkJcmVhZGVyLnJlYWRXU0RMKG1vZGVsLmdldFdlYlByb2plY3ROYW1lKCksIGxuYW1lKTsKLQotCQkJCXRoaXMuc2VydmljZVFOYW1lTGlzdCA9IHJlYWRlci5nZXRTZXJ2aWNlTGlzdCgpOwotCQkJCWlmICghc2VydmljZVFOYW1lTGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJc2VydmljZU5hbWVDb21iby5yZW1vdmVBbGwoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlUU5hbWVMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJCQkvLyBhZGQgdGhlIGxvY2FsIHBhcnQgb2YgdGhlCi0JCQkJCQlPYmplY3Qgc2VydmljZVFuYW1lSW5zdGFuY2UgPSBzZXJ2aWNlUU5hbWVMaXN0LmdldChpKTsKLQkJCQkJCUNsYXNzIFFOYW1lQ2xhc3MgPSBDbGFzc0xvYWRpbmdVdGlsCi0JCQkJCQkJCQkJLmxvYWRDbGFzc0Zyb21BbnRDbGFzc0xvYWRlcigiamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSIpOwotCQkJCQkJTWV0aG9kIEdldExvY2FsUGFydE1ldGhvZCAgPSBRTmFtZUNsYXNzLmdldE1ldGhvZCgiZ2V0TG9jYWxQYXJ0IiwgbnVsbCk7Ci0JCQkJCQlPYmplY3QgcmVzdWx0TG9jYWxQYXJ0ID0gR2V0TG9jYWxQYXJ0TWV0aG9kCi0JCQkJCQkJCQkJCQkJLmludm9rZShzZXJ2aWNlUW5hbWVJbnN0YW5jZSwgbnVsbCk7Ci0JCQkJCQlzZXJ2aWNlTmFtZUNvbWJvLmFkZChyZXN1bHRMb2NhbFBhcnQudG9TdHJpbmcoKSk7Ci0JCQkJCX0KLQkJCQkJOwotCQkJCQkvLyBzZWxlY3QgdGhlIGZpcnN0IG9uZSBhcyB0aGUgZGVmYXVsdAotCQkJCQlzZXJ2aWNlTmFtZUNvbWJvLnNlbGVjdCgwKTsKLQotCQkJCQkvLyBsb2FkIHRoZSBwb3J0cwotCQkJCQlsb2FkUG9ydE5hbWVzKCk7Ci0KLQkJCQl9IGVsc2UgewotCQkJCQkvLyBzZXJ2aWNlIG5hbWUgbGlzdCBiZWluZyBlbXB0eSBtZWFucyB3ZSBhcmUgc3dpdGNoaW5nIHRvCi0JCQkJCS8vIHRoZSBpbnRlcmZhY2UgbW9kZQotCQkJCQlpZiAoc2VydmljZU5hbWVDb21ibyE9bnVsbCkgc2VydmljZU5hbWVDb21iby5yZW1vdmVBbGwoKTsKLQkJCQkJaWYgKHBvcnROYW1lQ29tYm8hPW51bGwpIHBvcnROYW1lQ29tYm8ucmVtb3ZlQWxsKCk7Ci0KLQkJCQl9Ci0KLQkJCQlwb3B1bGF0ZVBhY2thZ2VOYW1lKCk7Ci0KLQkJCQkvL3BvcHVsYXRlIHRoZSBuYW1lc3BhY2VzcwotCQkJCWxvYWROYW1lc3BhY2VzKHJlYWRlci5nZXREZWZpbml0aW9uTmFtZXNwYWNlTWFwKCkpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzKCJqYXZheC53c2RsLldTRExFeGNlcHRpb24iKSkKLQkJCXN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKAotCQkJCQlOTFMuYmluZChBeGlzMkNyZWF0aW9uVUlNZXNzYWdlcy5FUlJPUl9JTlZBTElEX1dTRExfRklMRV9SRUFEX1dSSVRFTCwKLQkJCQkJCQkgbmV3IFN0cmluZ1tde2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvYWRQb3J0TmFtZXMoKSB7Ci0JCWludCBzZWxlY3Rpb25JbmRleCA9IHNlcnZpY2VOYW1lQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJaWYgKHNlbGVjdGlvbkluZGV4ICE9IC0xKSB7Ci0JCQlqYXZhLnV0aWwuTGlzdCBwb3J0cyA9IHJlYWRlci5nZXRQb3J0TmFtZUxpc3Qoc2VydmljZVFOYW1lTGlzdAotCQkJCQkuZ2V0KHNlbGVjdGlvbkluZGV4KSk7Ci0JCQlpZiAoIXBvcnRzLmlzRW1wdHkoKSkgewotCQkJCXBvcnROYW1lQ29tYm8ucmVtb3ZlQWxsKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwb3J0cy5zaXplKCk7IGkrKykgewotCQkJCQkvLyBhZGQgdGhlIGxvY2FsIHBhcnQgb2YgdGhlCi0JCQkJCXBvcnROYW1lQ29tYm8uYWRkKHBvcnRzLmdldChpKS50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQkJcG9ydE5hbWVDb21iby5zZWxlY3QoMCk7Ci0JCQkJbW9kZWwuc2V0UG9ydE5hbWUocG9ydE5hbWVDb21iby5nZXRUZXh0KCkpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBUT0RPIGVycm9yIG5vIHBvcnRzIGZvdW5kCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGaWxsIHRoZSBjb21ibyB3aXRoIHByb3BlciBkYXRhYmluZGluZyBuYW1lcwotCSAqLwotCXByaXZhdGUgdm9pZCBmaWxsRGF0YWJpbmRlckNvbWJvKCkgewotCQlkYXRhYmluZGluZ1R5cGVDb21iby5hZGQoQXhpczJDb25zdGFudHMuREFUQV9CSU5ESU5HX0FEQik7Ci0JCWRhdGFiaW5kaW5nVHlwZUNvbWJvLmFkZChBeGlzMkNvbnN0YW50cy5EQVRBX0JJTkRJTkdfWE1MQkVBTlMpOwotCQlkYXRhYmluZGluZ1R5cGVDb21iby5hZGQoQXhpczJDb25zdGFudHMuREFUQV9CSU5ESU5HX05PTkUpOwotCQlpbnQgc2VsZWN0ZWQgPSBkYXRhYmluZGluZ1R5cGVDb21iby5pbmRleE9mKGNvbnRleHQuZ2V0U2VydmljZURhdGFiaW5kaW5nKCkudG9VcHBlckNhc2UoKSk7Ci0JCWlmIChzZWxlY3RlZD09LTEpCi0JCQlkYXRhYmluZGluZ1R5cGVDb21iby5zZWxlY3QoMCk7Ci0JCWVsc2UKLQkJCWRhdGFiaW5kaW5nVHlwZUNvbWJvLnNlbGVjdChzZWxlY3RlZCk7Ci0JfQotCQotCQotCS8qKgotCSAqIEEgdXRpbCBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IGNvbHVtbgotCSAqIEBwYXJhbSB0YWJsZQotCSAqIEBwYXJhbSB3aWR0aAotCSAqIEBwYXJhbSBjb2xOYW1lCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRlY2xhcmVDb2x1bW4oVGFibGUgdGFibGUsIGludCB3aWR0aCxTdHJpbmcgY29sTmFtZSl7Ci0gICAgICAgIFRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSxTV1QuTk9ORSk7Ci0gICAgICAgIGNvbHVtbi5zZXRXaWR0aCh3aWR0aCk7Ci0gICAgICAgIGNvbHVtbi5zZXRUZXh0KGNvbE5hbWUpOwotICAgIH0KLQkKLQkvKioKLQkgKiBMb2FkcyB0aGUgbmFtZXNwYWNlcwotCSAqIEBwYXJhbSBuYW1lc3BhY2VNYXAKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZE5hbWVzcGFjZXMoTWFwIG5hbWVzcGFjZU1hcCl7Ci0JCUl0ZXJhdG9yIG5hbWVzcGFjZXMgPSBuYW1lc3BhY2VNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5yZW1vdmVBbGwoKTsKLSAgICAgICAgVGFibGVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVJdGVtW25hbWVzcGFjZU1hcC5zaXplKCldOyAvLyBBbiBpdGVtIGZvciBlYWNoIGZpZWxkCi0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgd2hpbGUobmFtZXNwYWNlcy5oYXNOZXh0KCkpewotICAgICAgICAJCi0gICAgICAgICAgIGl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbShuYW1lc3BhY2UycGFja2FnZVRhYmxlLCBTV1QuTlVMTCk7Ci0gICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSAoU3RyaW5nKW5hbWVzcGFjZXMubmV4dCgpOwotICAgICAgICAgICBpdGVtc1tpXS5zZXRUZXh0KDAsbmFtZXNwYWNlKTsKLSAgICAgICAgICAgaXRlbXNbaV0uc2V0VGV4dCgxLGdldFBhY2thZ2VGcm9tTmFtZXNwYWNlKG5hbWVzcGFjZSkpOwotICAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLSAgICAgICAgbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5zZXRWaXNpYmxlKHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIHBhY2thZ2UgdG8gbmFtZXNwYWNlIG1hcHBpbmdzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TnMyUGtnTWFwcGluZygpewotCQlTdHJpbmcgcmV0dXJuTGlzdD0iIjsKLQkJVGFibGVJdGVtW10gaXRlbXMgPSBuYW1lc3BhY2UycGFja2FnZVRhYmxlLmdldEl0ZW1zKCk7Ci0JCVN0cmluZyBwYWNrYWdlVmFsdWU7IAotCQlmb3IgKGludCBpPTA7aTxpdGVtcy5sZW5ndGg7aSsrKXsKLQkJCXBhY2thZ2VWYWx1ZSA9IGl0ZW1zW2ldLmdldFRleHQoMSk7Ci0JCQlpZiAocGFja2FnZVZhbHVlIT1udWxsICYmICEiIi5lcXVhbHMocGFja2FnZVZhbHVlKSl7Ci0JCQkJcmV0dXJuTGlzdCA9IHJldHVybkxpc3QgKwotCQkJCSAgICAgICAgICAgICAoIiIuZXF1YWxzKHJldHVybkxpc3QpPyIiOiIsIikgKwotCQkJCSAgICAgICAgICAgICBpdGVtc1tpXS5nZXRUZXh0KDApKyAiPSIgKyBwYWNrYWdlVmFsdWU7Ci0JCQl9Ci0JCQkKLQkJfQotCQlyZXR1cm4gIiIuZXF1YWxzKHJldHVybkxpc3QpP251bGw6cmV0dXJuTGlzdDsKLQl9Ci0JCi0JCi0JLyoqCi0JICogZ2V0IHRoZSBwYWNrYWdlIGRlcml2ZWQgYnkgIE5hbWVzcGFjZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZUZyb21OYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSl7Ci0JCQotCQlPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vQ2xhc3MgVVJMUHJvY2Vzc29yID0gQ2xhc3MuZm9yTmFtZSgib3JnLmFwYWNoZS5heGlzMi51dGlsLlVSTFByb2Nlc3NvciIpOwotCQkJQ2xhc3MgVVJMUHJvY2Vzc29yID0gQ2xhc3NMb2FkaW5nVXRpbAotCQkJCQkJLmxvYWRDbGFzc0Zyb21BbnRDbGFzc0xvYWRlcigib3JnLmFwYWNoZS5heGlzMi51dGlsLlVSTFByb2Nlc3NvciIpOwotCQkJQ2xhc3MgcGFyYW1ldGVyVHlwZXNbXSA9IG5ldyBDbGFzc1sxXTsKLQkJCXBhcmFtZXRlclR5cGVzWzBdID0gU3RyaW5nLmNsYXNzOwotCQkJTWV0aG9kIG1ha2VQYWNrYWdlTmFtZU1ldGhvZCA9IFVSTFByb2Nlc3NvcgotCQkJCQkJCQkJLmdldE1ldGhvZCgibWFrZVBhY2thZ2VOYW1lIiwgcGFyYW1ldGVyVHlwZXMpOwotCQkJT2JqZWN0IGFyZ3NbXSA9IG5ldyBPYmplY3RbMV07Ci0JCQlhcmdzWzBdID0gbmFtZXNwYWNlOwotCQkJcmVzdWx0ID0gbWFrZVBhY2thZ2VOYW1lTWV0aG9kLmludm9rZShtYWtlUGFja2FnZU5hbWVNZXRob2QsIGFyZ3MpOwotCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiAoU3RyaW5nKXJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpczIvY3JlYXRpb24vdWkvd3NydC9BeGlzMkJlYW5Db25maWdXaWRnZXRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMyL2NyZWF0aW9uL3VpL3dzcnQvQXhpczJCZWFuQ29uZmlnV2lkZ2V0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2FlN2ZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpczIvY3JlYXRpb24vdWkvd3NydC9BeGlzMkJlYW5Db25maWdXaWRnZXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAxMTAgICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgQXhpczIgCi0gKiAJCQkJCQkJCQkJICBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotICogMjAwNzA0MjUgICAxODMwNDYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aAotICogMjAwNzA2MDEgICAxOTA1MDUgcG1vb2drQGNhLmlibS5jb20gLSBQZXRlciBNb29nawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMyLmNyZWF0aW9uLnVpLndzcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS5jb21tYW5kLkF4aXMyRGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUuZGF0YS5EYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUubWVzc2FnZXMuQXhpczJDcmVhdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMyLmNyZWF0aW9uLnVpLndpZGdldHMuYmVhbi5TZXJ2aWNlc1hNTFNlbGVjdEJlYW5XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLklOYW1lZFdpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLklOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotCi1wdWJsaWMgY2xhc3MgQXhpczJCZWFuQ29uZmlnV2lkZ2V0RmFjdG9yeSBpbXBsZW1lbnRzIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSB7Ci0KLQlwcml2YXRlIFNpbXBsZVdpZGdldENvbnRyaWJ1dG9yICBzZXJ2aWNlc1hNTFNlbGVjdFdpZGdldENvbnRyaWI7Ci0JcHJpdmF0ZSBEYXRhTW9kZWwgICAgICAgICAgICAgICAgbW9kZWw7Ci0KLQlwdWJsaWMgQXhpczJCZWFuQ29uZmlnV2lkZ2V0RmFjdG9yeSgpewkgIAotCX0KLQotCXB1YmxpYyBJTmFtZWRXaWRnZXRDb250cmlidXRvciBnZXRGaXJzdE5hbWVkV2lkZ2V0KCl7Ci0JCWlmKCBzZXJ2aWNlc1hNTFNlbGVjdFdpZGdldENvbnRyaWIgPT0gbnVsbCApIGluaXQoKTsKLQkJcmV0dXJuIHNlcnZpY2VzWE1MU2VsZWN0V2lkZ2V0Q29udHJpYjsKLQl9Ci0KLQlwdWJsaWMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgZ2V0TmV4dE5hbWVkV2lkZ2V0KCBJTmFtZWRXaWRnZXRDb250cmlidXRvciB3aWRnZXRDb250cmlidXRvcil7Ci0JCWlmKCBzZXJ2aWNlc1hNTFNlbGVjdFdpZGdldENvbnRyaWIgPT0gbnVsbCApIGluaXQoKTsKLQkJSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgbmV4dFdpZGdldENvbnRyaWIgPSBudWxsOwotCQlyZXR1cm4gbmV4dFdpZGdldENvbnRyaWI7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpIAotCXsKLQkJLy8gTWFwIHRoZSBkYXRhIG1vZGVsIGZyb20gdGhlIGRlZmF1bHRpbmcgY29tbWFuZCB0byB0aGlzIHdpZGdldCBmYWN0b3J5LgotCQkvLyBUaGUgZnJhbWV3b3JrIHdpbGwgYWN0dWFsbHkgdG8gdGhlIGNhbGwgdG8gZ2V0V2ViU2VydmljZURhdGFNb2RlbCBpbgotCQkvLyB0aGUgRXhhbXBsZURlZmF1bHRpbmdDb21tYW5kIGNsYXNzIGFuZCB0aGVuIGNhbGwgdGhlIHNldFdlYlNlcnZpY2VEYXRhTW9kZWwKLQkJLy8gbWV0aG9kIGluIHRoaXMgY2xhc3MuCi0JCWRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBBeGlzMkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICJXZWJTZXJ2aWNlRGF0YU1vZGVsIiwgIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJICAgICAgICAgICAgIEF4aXMyQmVhbkNvbmZpZ1dpZGdldEZhY3RvcnkuY2xhc3MgKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlRGF0YU1vZGVsKCBEYXRhTW9kZWwgbW9kZWwgKXsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0KCl7Ci0JCS8vUGFnZXMgb2YgQXhpczIgV2ViIFNlcnZpY2VzIEphdmEgQmVhbiBTY2VuYXJpbwotCQlTZXJ2aWNlc1hNTFNlbGVjdEJlYW5XaWRnZXQgc2VydmljZXNYTUxTZWxlY3RXaWRnZXQgPSAKLQkJCQkJCQkJbmV3IFNlcnZpY2VzWE1MU2VsZWN0QmVhbldpZGdldChtb2RlbCk7Ci0JCXNlcnZpY2VzWE1MU2VsZWN0V2lkZ2V0Q29udHJpYiAgPSBjcmVhdGVXaWRnZXRDb250cmlidXRvciggCi0JCQkJQXhpczJDcmVhdGlvblVJTWVzc2FnZXMuTEFCRUxfQVhJUzJfUFJFRkVSRU5DRV9QQUdFX0hFQURJTkcsCi0JCQkJQXhpczJDcmVhdGlvblVJTWVzc2FnZXMuTEFCRUxfQVhJUzJfUFJFRkVSRU5DRV9QQUdFX1NVQl9IRUFESU5HLCAKLQkJCQlzZXJ2aWNlc1hNTFNlbGVjdFdpZGdldCApOwotCX0KLQotCXByaXZhdGUgU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlV2lkZ2V0Q29udHJpYnV0b3IoU3RyaW5nIHRpdGxlLCAKLQkJCQkJCQkJCQkJCQkJCVN0cmluZyBkZXNjcmlwdGlvbiwgCi0JCQkJCQkJCQkJCQkJCQlmaW5hbCBXaWRnZXREYXRhQ29udHJpYnV0b3IgY29udHJpYnV0b3IpewotCQlTaW1wbGVXaWRnZXRDb250cmlidXRvciB3aWRnZXRDb250cmliICA9IG5ldyBTaW1wbGVXaWRnZXRDb250cmlidXRvcigpOwotCQl3aWRnZXRDb250cmliLnNldFRpdGxlKHRpdGxlKTsKLQkJd2lkZ2V0Q29udHJpYi5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JCXdpZGdldENvbnRyaWIuc2V0RmFjdG9yeSggbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpewotCQkJcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpewotCQkJCXJldHVybiBjb250cmlidXRvcjsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiB3aWRnZXRDb250cmliOwotCX0gICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpczIvY3JlYXRpb24vdWkvd3NydC9BeGlzMkNoZWNrV1NETENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpczIvY3JlYXRpb24vdWkvd3NydC9BeGlzMkNoZWNrV1NETENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I0ZDNhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMyL2NyZWF0aW9uL3VpL3dzcnQvQXhpczJDaGVja1dTRExDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwODAxMjkgICAyMDk0MTEga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpczIuY3JlYXRpb24udWkud3NydDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29uc3VtcHRpb24uY29yZS51dGlscy5TZXJ2aWNlUGluZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIEF4aXMyQ2hlY2tXU0RMQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uewotCQotCXByaXZhdGUgQXhpczJXZWJTZXJ2aWNlIHdzXzsKLQotCXByaXZhdGUgU3RyaW5nIHdzZGxVUklfOwotCQotCXB1YmxpYyBBeGlzMkNoZWNrV1NETENvbW1hbmQoKSB7Ci0JfQotCQotCXB1YmxpYyBBeGlzMkNoZWNrV1NETENvbW1hbmQoQXhpczJXZWJTZXJ2aWNlIHdzKSB7Ci0JCXdzXyA9IHdzOwotCi0JfQotCQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhZGFwdGFibGUgKSAKLQl7Ci0JIAkKLQkgCXdzZGxVUklfID0gd3NfLmdldFdlYlNlcnZpY2VJbmZvKCkuZ2V0V3NkbFVSTCgpOwotCQl0cnkgewotCQkJU2VydmljZVBpbmdVdGlsIHNlcnZpY2VQaW5nVXRpbCA9IG5ldyBTZXJ2aWNlUGluZ1V0aWwoKTsKLQkJCXNlcnZpY2VQaW5nVXRpbC5jb25uZWN0VG9VUkwod3NkbFVSSV8pOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChlIGluc3RhbmNlb2YgSU9FeGNlcHRpb24pIHsKLQkJCQl0cnkgewotCQkJCQl0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZTEpIHsKLQkJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JICB9Ci0JCi0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0V3NkbFVSSSgpIHsKLQkJcmV0dXJuIHdzZGxVUklfOwotCX0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMyL2NyZWF0aW9uL3VpL3dzcnQvQXhpczJTa2VsQ29uZmlnV2lkZ2V0RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzMi9jcmVhdGlvbi91aS93c3J0L0F4aXMyU2tlbENvbmZpZ1dpZGdldEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIxNzA2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMyL2NyZWF0aW9uL3VpL3dzcnQvQXhpczJTa2VsQ29uZmlnV2lkZ2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogV1NPMiBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwMTEwICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgY29kZSB0byBpbnRyb2R1c2UgdGhlIEF4aXMyIAotICogCQkJCQkJCQkJCSAgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSAqIDIwMDcwNjAxICAgMTkwNTA1IHBtb29na0BjYS5pYm0uY29tIC0gUGV0ZXIgTW9vZ2sKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzMi5jcmVhdGlvbi51aS53c3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUuY29tbWFuZC5BeGlzMkRlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLmRhdGEuRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLm1lc3NhZ2VzLkF4aXMyQ3JlYXRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzMi5jcmVhdGlvbi51aS53aWRnZXRzLnNrZWxldG9uLldTREwySkFWQVNrZWxDb25maWdXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLklOYW1lZFdpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLklOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotCi1wdWJsaWMgY2xhc3MgQXhpczJTa2VsQ29uZmlnV2lkZ2V0RmFjdG9yeSBpbXBsZW1lbnRzIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSB7Ci0KLQlwcml2YXRlIFNpbXBsZVdpZGdldENvbnRyaWJ1dG9yICBza2VsQ29uZmlnMVdpZGdldENvbnRyaWI7Ci0JcHJpdmF0ZSBEYXRhTW9kZWwgICAgICAgICAgICAgICAgbW9kZWw7Ci0KLQlwdWJsaWMgQXhpczJTa2VsQ29uZmlnV2lkZ2V0RmFjdG9yeSgpewkgIAotCX0KLQotCXB1YmxpYyBJTmFtZWRXaWRnZXRDb250cmlidXRvciBnZXRGaXJzdE5hbWVkV2lkZ2V0KCl7Ci0JCWlmKCBza2VsQ29uZmlnMVdpZGdldENvbnRyaWIgPT0gbnVsbCApIGluaXQoKTsKLQkJcmV0dXJuIHNrZWxDb25maWcxV2lkZ2V0Q29udHJpYjsKLQl9Ci0KLQlwdWJsaWMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgZ2V0TmV4dE5hbWVkV2lkZ2V0KCBJTmFtZWRXaWRnZXRDb250cmlidXRvciB3aWRnZXRDb250cmlidXRvcil7Ci0JCWlmKCBza2VsQ29uZmlnMVdpZGdldENvbnRyaWIgPT0gbnVsbCApIGluaXQoKTsKLQkJSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgbmV4dFdpZGdldENvbnRyaWIgPSBudWxsOwotCQlyZXR1cm4gbmV4dFdpZGdldENvbnRyaWI7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpewotCQkvLyBNYXAgdGhlIGRhdGEgbW9kZWwgZnJvbSB0aGUgZGVmYXVsdGluZyBjb21tYW5kIHRvIHRoaXMgd2lkZ2V0IGZhY3RvcnkuCi0JCS8vIFRoZSBmcmFtZXdvcmsgd2lsbCBhY3R1YWxseSB0byB0aGUgY2FsbCB0byBnZXRXZWJTZXJ2aWNlRGF0YU1vZGVsIGluCi0JCS8vIHRoZSBFeGFtcGxlRGVmYXVsdGluZ0NvbW1hbmQgY2xhc3MgYW5kIHRoZW4gY2FsbCB0aGUgc2V0V2ViU2VydmljZURhdGFNb2RlbAotCQkvLyBtZXRob2QgaW4gdGhpcyBjbGFzcy4KLQkJZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIEF4aXMyRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2ViU2VydmljZURhdGFNb2RlbCIsICAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSAgICAgICAgICAgICBBeGlzMlNrZWxDb25maWdXaWRnZXRGYWN0b3J5LmNsYXNzICk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0V2ViU2VydmljZURhdGFNb2RlbCggRGF0YU1vZGVsIG1vZGVsICl7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdCgpewotCQlXU0RMMkpBVkFTa2VsQ29uZmlnV2lkZ2V0ICBza2VsMSA9IG5ldyBXU0RMMkpBVkFTa2VsQ29uZmlnV2lkZ2V0KCBtb2RlbCApOwotCi0JCXNrZWxDb25maWcxV2lkZ2V0Q29udHJpYiAgPSBjcmVhdGVXaWRnZXRDb250cmlidXRvciggCi0JCQkJQXhpczJDcmVhdGlvblVJTWVzc2FnZXMuTEFCRUxfSkFWQV8yX1dTRExfUEFHRV9IRUFESU5HLAotCQkJCUF4aXMyQ3JlYXRpb25VSU1lc3NhZ2VzLkxBQkVMX0pBVkFfMl9XU0RMX1BBR0VfU1VCX0hFQURJTkcsIAotCQkJCXNrZWwxICk7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVXaWRnZXRDb250cmlidXRvciBjcmVhdGVXaWRnZXRDb250cmlidXRvcihTdHJpbmcgdGl0bGUsIAotCQkJCQkJCQkJCQkJCQkJU3RyaW5nIGRlc2NyaXB0aW9uLCAKLQkJCQkJCQkJCQkJCQkJCWZpbmFsIFdpZGdldERhdGFDb250cmlidXRvciBjb250cmlidXRvcil7Ci0JCVNpbXBsZVdpZGdldENvbnRyaWJ1dG9yIHdpZGdldENvbnRyaWIgID0gbmV3IFNpbXBsZVdpZGdldENvbnRyaWJ1dG9yKCk7Ci0JCXdpZGdldENvbnRyaWIuc2V0VGl0bGUodGl0bGUpOwotCQl3aWRnZXRDb250cmliLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQkJd2lkZ2V0Q29udHJpYi5zZXRGYWN0b3J5KCBuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCl7Ci0JCQlwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCl7Ci0JCQkJcmV0dXJuIGNvbnRyaWJ1dG9yOwotCQkJfQotCQl9KTsKLQotCQlyZXR1cm4gd2lkZ2V0Q29udHJpYjsKLQl9ICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMyL2NyZWF0aW9uL3VpL3dzcnQvQXhpczJXZWJTZXJ2aWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMyL2NyZWF0aW9uL3VpL3dzcnQvQXhpczJXZWJTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiODExMWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzMi9jcmVhdGlvbi91aS93c3J0L0F4aXMyV2ViU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDExMCAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotICogMjAwNzA0MjUgICAxODMwNDYgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aAotICogMjAwNzA4MTUgICAxODc4NDAgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aAotICogMjAwODAxMjkgICAyMDk0MTEga2F0aHlAY2EuaWJtLmNvbSAtIEthdGh5IENoYW4KLSAqIDIwMDgwNjIwICAgMTkyNTI3IHNhbWluZGF3QHdzbzIuY29tIC0gU2FtaW5kYSBXaWplcmF0bmUsIFVwZGF0ZSB0aGUgbW9kZWwgaW5mb3JtYXRpb24gd2l0aCB0aGUgYXhpczIgcHJlZmVyZW5jZSBzZXR0aW5ncwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzMi5jcmVhdGlvbi51aS53c3J0OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBeGlzMkVtaXR0ZXJDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLmNvbW1hbmQuQXhpczJCVUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUuY29tbWFuZC5BeGlzMkJVU2VydmljZUNyZWF0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS5jb21tYW5kLkF4aXMyQnVpbGRQcm9qZWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS5jb21tYW5kLkF4aXMyQ2xlYW51cENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUuY29tbWFuZC5BeGlzMkRlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLmNvbW1hbmQuQXhpczJTZXJ2aWNlc1hNTFZhbGlkYXRpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLmNvbW1hbmQuQXhpczJTa2VsSW1wbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUuY29tbWFuZC5BeGlzMlREQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24uY29yZS5jb21tYW5kLkF4aXMyVERTZXJ2aWNlQ3JlYXRpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLmNvbW1hbmQuQXhpczJXU0RMMkphdmFDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi5jb3JlLmNvbW1hbmQuQXhpczJXZWJzZXJ2aWNlc1NlcnZlckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLmNvcmUuZGF0YS5EYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuSUNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LkFic3RyYWN0V2ViU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LldlYlNlcnZpY2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LldlYlNlcnZpY2VTY2VuYXJpbzsKLQotcHVibGljIGNsYXNzIEF4aXMyV2ViU2VydmljZSBleHRlbmRzIEFic3RyYWN0V2ViU2VydmljZQotewotLy8JcHJpdmF0ZSBBeGlzMldlYlNlcnZpY2VJbmZvIGF4aXMyV2ViU2VydmljZUluZm87Ci0KLQlwdWJsaWMgQXhpczJXZWJTZXJ2aWNlKFdlYlNlcnZpY2VJbmZvIGluZm8pCi0JewotCQlzdXBlcihpbmZvKTsKLQl9Ci0KLQlwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGFzc2VtYmxlKElFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwKLQkJCUlTZWxlY3Rpb24gc2VsLCBTdHJpbmcgcHJvamVjdCwgU3RyaW5nIGVhclByb2plY3QpCi0JewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGRlcGxveShJRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLAotCQkJU3RyaW5nIHByb2plY3QsIFN0cmluZyBlYXJQcm9qZWN0KQotCXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElDb21tYW5kRmFjdG9yeSBkZXZlbG9wKElFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsCi0JCQlTdHJpbmcgcHJvamVjdCwgU3RyaW5nIGVhclByb2plY3QpCi0JewotCQlWZWN0b3IgY29tbWFuZHMgPSBuZXcgVmVjdG9yKCk7Ci0JCURhdGFNb2RlbCBtb2RlbCA9IG5ldyBEYXRhTW9kZWwoKTsKLQkJLy9FY2xpcHNlRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSAoRWNsaXBzZUVudmlyb25tZW50KWVudjsKLQotCQltb2RlbC5zZXRXZWJQcm9qZWN0TmFtZShwcm9qZWN0KTsKLQkJc2V0dXBEYXRhTW9kZWxEZWZhdWx0UHJlZmVyZW5jZVZhbHVlcyhtb2RlbCk7Ci0JCWlmIChjdHguZ2V0U2NlbmFyaW8oKS5nZXRWYWx1ZSgpID09IFdlYlNlcnZpY2VTY2VuYXJpby5CT1RUT01VUCkJeyAKLQkJCWNvbW1hbmRzLmFkZChuZXcgQXhpczJEZWZhdWx0aW5nQ29tbWFuZCggbW9kZWwsdGhpcywgY3R4LmdldFNjZW5hcmlvKCkuZ2V0VmFsdWUoKSApICk7Ci0JCQljb21tYW5kcy5hZGQobmV3IEF4aXMyQlVDb21tYW5kKCBtb2RlbCApICk7Ci0JCQljb21tYW5kcy5hZGQobmV3IEF4aXMyU2VydmljZXNYTUxWYWxpZGF0aW9uQ29tbWFuZCgpKTsKLQkJCWNvbW1hbmRzLmFkZChuZXcgQXhpczJCVVNlcnZpY2VDcmVhdGlvbkNvbW1hbmQobW9kZWwsdGhpcyxwcm9qZWN0KSk7Ci0JCQljb21tYW5kcy5hZGQobmV3IEF4aXMyV2Vic2VydmljZXNTZXJ2ZXJDb21tYW5kKG1vZGVsLCBjdHguZ2V0U2NlbmFyaW8oKS5nZXRWYWx1ZSgpICkpOwotCQkJLy9JbmNsdWRpbmcgY29tbWFuZCB0byBidWlsZCBmb3IgdGhlIGZpeCAxODc4NDAKLQkJCWNvbW1hbmRzLmFkZCggbmV3IEF4aXMyQnVpbGRQcm9qZWN0Q29tbWFuZCgKLQkJCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3QpLHRydWUpKTsKLQkJfSAKLQkJZWxzZSBpZiAoY3R4LmdldFNjZW5hcmlvKCkuZ2V0VmFsdWUoKSA9PSBXZWJTZXJ2aWNlU2NlbmFyaW8uVE9QRE9XTikgeyAgCi0JCQljb21tYW5kcy5hZGQobmV3IEF4aXMyRGVmYXVsdGluZ0NvbW1hbmQoIG1vZGVsLHRoaXMsIGN0eC5nZXRTY2VuYXJpbygpLmdldFZhbHVlKCkgICkgKTsKLQkJCWNvbW1hbmRzLmFkZChuZXcgQXhpczJURENvbW1hbmQoIG1vZGVsKSApOwotCQkJY29tbWFuZHMuYWRkKG5ldyBBeGlzMldTREwySmF2YUNvbW1hbmQoIG1vZGVsKSApOwotCQkJY29tbWFuZHMuYWRkKCBuZXcgQXhpczJCdWlsZFByb2plY3RDb21tYW5kKAotCQkJCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3QpLHRydWUpKTsKLQkJCWNvbW1hbmRzLmFkZChuZXcgQXhpczJURFNlcnZpY2VDcmVhdGlvbkNvbW1hbmQobW9kZWwsdGhpcyxwcm9qZWN0KSk7Ci0JCQljb21tYW5kcy5hZGQobmV3IEF4aXMyV2Vic2VydmljZXNTZXJ2ZXJDb21tYW5kKG1vZGVsLCBjdHguZ2V0U2NlbmFyaW8oKS5nZXRWYWx1ZSgpKSk7Ci0JCQkvL3llcywgYWdhaW4gaW52b2tlIHRoZSBidWlsZCBjb21tYW5kIHRvIHJlZGVwbG95IHRoZSBzZXJ2aWNlIGFmdGVyIGNvbXBsZXRlIGZ1bGwgYnVpbGQKLQkJCWNvbW1hbmRzLmFkZCggbmV3IEF4aXMyQnVpbGRQcm9qZWN0Q29tbWFuZCgKLQkJCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0KSx0cnVlKSk7Ci0JCQljb21tYW5kcy5hZGQobmV3IEF4aXMyU2tlbEltcGxDb21tYW5kKHRoaXMuZ2V0V2ViU2VydmljZUluZm8oKSxtb2RlbCkpOwotCQkJY29tbWFuZHMuYWRkKG5ldyBBeGlzMkNsZWFudXBDb21tYW5kKCkpOwotCQl9IAotCQllbHNlIAotCQl7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXJldHVybiBuZXcgU2ltcGxlQ29tbWFuZEZhY3RvcnkoY29tbWFuZHMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldHVwRGF0YU1vZGVsRGVmYXVsdFByZWZlcmVuY2VWYWx1ZXMoRGF0YU1vZGVsIG1vZGVsKXsKLQkJUGVyc2lzdGVudEF4aXMyRW1pdHRlckNvbnRleHQgYXhpczJQcmVmID0gUGVyc2lzdGVudEF4aXMyRW1pdHRlckNvbnRleHQuZ2V0SW5zdGFuY2UoKTsKLQkJbW9kZWwuc2V0R2VuZXJhdGVTZXJ2ZXJTaWRlSW50ZXJmYWNlKGF4aXMyUHJlZi5pc1NlcnZpY2VJbnRlcmZhY2VTa2VsZXRvbigpKTsKLQkJbW9kZWwuc2V0R2VuZXJhdGVBbGxDaGVjayhheGlzMlByZWYuaXNTZXJ2aWNlR2VuZXJhdGVBbGwoKSk7Ci0JfQotCQotCXB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgaW5zdGFsbChJRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLAotCQkJU3RyaW5nIHByb2plY3QsIFN0cmluZyBlYXJQcm9qZWN0KQotCXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElDb21tYW5kRmFjdG9yeSBydW4oSUVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwKLQkJCVN0cmluZyBwcm9qZWN0LCBTdHJpbmcgZWFyUHJvamVjdCkKLQl7Ci0JCVZlY3RvciBjb21tYW5kcyA9IG5ldyBWZWN0b3IoKTsKLQotCQkKLQkJCWNvbW1hbmRzLmFkZChuZXcgQXhpczJDaGVja1dTRExDb21tYW5kKHRoaXMpKTsKLQkJCQotCi0JCQlyZXR1cm4gbmV3IFNpbXBsZUNvbW1hbmRGYWN0b3J5KGNvbW1hbmRzKTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpczIvY3JlYXRpb24vdWkvd3NydC9BeGlzMldlYlNlcnZpY2VJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMyL2NyZWF0aW9uL3VpL3dzcnQvQXhpczJXZWJTZXJ2aWNlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjM1ZTlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpczIvY3JlYXRpb24vdWkvd3NydC9BeGlzMldlYlNlcnZpY2VJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IFdTTzIgSW5jLiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzAxMTAgICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgQXhpczIgCi0gKiAJCQkJCQkJCQkJICBydW50aW1lIHRvIHRoZSBmcmFtZXdvcmsgZm9yIDE2ODc2MgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMyLmNyZWF0aW9uLnVpLndzcnQ7Ci0KLXB1YmxpYyBjbGFzcyBBeGlzMldlYlNlcnZpY2VJbmZvIHsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzMi9jcmVhdGlvbi91aS93c3J0L0F4aXMyV2ViU2VydmljZVJ1bnRpbWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpczIvY3JlYXRpb24vdWkvd3NydC9BeGlzMldlYlNlcnZpY2VSdW50aW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZmI1ODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzMi9jcmVhdGlvbi91aS93c3J0L0F4aXMyV2ViU2VydmljZVJ1bnRpbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDExMCAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiAKLSAqIAkJCQkJCQkJCQkgIHJ1bnRpbWUgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzYyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpczIuY3JlYXRpb24udWkud3NydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzMi5jb25zdW1wdGlvbi51aS53c3J0LkF4aXMyV2ViU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5BYnN0cmFjdFdlYlNlcnZpY2VSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LklXZWJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LklXZWJTZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LldlYlNlcnZpY2VDbGllbnRJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LldlYlNlcnZpY2VJbmZvOwotCi1wdWJsaWMgY2xhc3MgQXhpczJXZWJTZXJ2aWNlUnVudGltZSBleHRlbmRzIEFic3RyYWN0V2ViU2VydmljZVJ1bnRpbWUKLXsKLQotCXB1YmxpYyBJV2ViU2VydmljZSBnZXRXZWJTZXJ2aWNlKFdlYlNlcnZpY2VJbmZvIGluZm8pewotCQlyZXR1cm4gbmV3IEF4aXMyV2ViU2VydmljZShpbmZvKTsKLQl9Ci0KLQlwdWJsaWMgSVdlYlNlcnZpY2VDbGllbnQgZ2V0V2ViU2VydmljZUNsaWVudChXZWJTZXJ2aWNlQ2xpZW50SW5mbyBpbmZvKXsKLQkJcmV0dXJuIG5ldyBBeGlzMldlYlNlcnZpY2VDbGllbnQoaW5mbyk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNGU4NjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk5MGFhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1idWlsZC54bWwKLWphdmFDb21waWxlci4uLmFyZ3MKLUBkb3QKLW9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aV8xLjAuMjAxLjIwMDgwNDAyMDIwNC5qYXIKLXRlbXAuZm9sZGVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2M3ZTE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY5YzI2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jVHVlIE1hciAyMCAxMDo0NTozOCBMS1QgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcxNzI0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVQTFVHSU5fTkFNRQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4zMDMucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkucGx1Z2luLldlYlNlcnZpY2VBeGlzMlVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlUExVR0lOX1BST1ZJREVSCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUsCi0gb3JnLmVjbGlwc2UuanN0LndzLAotIG9yZy5lY2xpcHNlLmpzdC53cy51aQotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkucGx1Z2luLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzMi5jb25zdW1wdGlvbi51aS5wcmVmZXJlbmNlcwotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc5OWJkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS9hYm91dC5pbmkgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YWYyOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9aWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZwotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS9hYm91dC5tYXBwaW5ncyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGRhYWI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpL2Fib3V0LnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjYwMzk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1ibHVyYj1FY2xpcHNlIFhNTCBFZGl0b3JzIGFuZCBUb29sc1xuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA1LCAyMDA5LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzU3YWQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYyBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIFdTTzIgSW5jIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0jIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIDIwMDcwMTMwICAgMTY4NzYyIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIEluaXRpYWwgQVBJIENvbnRyaWJ1dGlvbgotIyAyMDA3MDUwMiAgIDE4NDMwMiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBGaXggY29weXJpZ2h0IGZvciBBeGlzMiBwbHVnaW5zCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpL2ljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMDljMmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNDcwMWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBXU08yIEluYy4gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBXU08yIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSMgLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgMjAwNzAxMTggICAxNjg3NjIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgSW5pdGlhbCBjb2RlIHRvIGludHJvZHVzZSB0aGUgQXhpczIgcnVudGltZSB0byB0aGUgZnJhbWV3b3JrIGZvciAxNjg3NjIKLSMgMjAwNzA1MDEgICAxODQ2MTcgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgUHJvdmlkZSBwbHVnaW4gZGV0YWlscwotIyAyMDA4MDUzMCAgIDIzNDg0MSBrYXRoeUBjYS5pYm0uY29tIC0gS2F0aHkgQ2hhbiwgQ2hhbmdlIHBsdWdpbiBwcm92aWRlciB0byBFY2xpcHNlLm9yZwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotCi0jCi0jIE1lc3NhZ2VzIGluIHBsdWdpbi54bWwuCi1QTFVHSU5fTkFNRT1BeGlzMiBUb29scwotUExVR0lOX1BST1ZJREVSPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLSMgV2ViIFNlcnZpY2VzIFByZWZlcmFuY2UgUGFnZXMKLSMgQ2F0ZWdvcmllcwotUFJFRkVSRU5DRV9DQVRFR09SWV9BWElTMl9SVU5USU1FPUF4aXMyIFByZWZlcmVuY2VzIApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMjIxMDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTxwbHVnaW4+Ci0gIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4gICAgIAotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIG5hbWU9IiVQUkVGRVJFTkNFX0NBVEVHT1JZX0FYSVMyX1JVTlRJTUUiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLnByZWZlcmVuY2VzLm5hbWUiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMyLmNvbnN1bXB0aW9uLnVpLnByZWZlcmVuY2VzLkF4aXMyUnVudGltZVByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzMi5jb25zdW1wdGlvbi51aS5wcmVmZXJlbmNlcy5BeGlzMlJ1bnRpbWVQcmVmZXJlbmNlUGFnZSI+Ci0gICAgICA8L3BhZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi91aS9wbHVnaW4vV2ViU2VydmljZUF4aXMyVUlQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvdWkvcGx1Z2luL1dlYlNlcnZpY2VBeGlzMlVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYmE4NDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi91aS9wbHVnaW4vV2ViU2VydmljZUF4aXMyVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDEzMCAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiAKLSAqIAkJCQkJCQkJCQkgIHJ1bnRpbWUgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzYyCi0gKiAyMDA3MDQyNSAgIDE4MzA0NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLnBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZUF4aXMyVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aSI7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgV2ViU2VydmljZUF4aXMyVUlQbHVnaW4gcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBXZWJTZXJ2aWNlQXhpczJVSVBsdWdpbigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VBeGlzMlVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMyL2NvbnN1bXB0aW9uL3VpL3ByZWZlcmVuY2VzL0F4aXMyUnVudGltZVByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMyL2NvbnN1bXB0aW9uL3VpL3ByZWZlcmVuY2VzL0F4aXMyUnVudGltZVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NTQ4YjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzMi9jb25zdW1wdGlvbi91aS9wcmVmZXJlbmNlcy9BeGlzMlJ1bnRpbWVQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgV1NPMiBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIFdTTzIgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDEzMCAgIDE2ODc2MiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBJbml0aWFsIGNvZGUgdG8gaW50cm9kdXNlIHRoZSBBeGlzMiAKLSAqICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWUgdG8gdGhlIGZyYW1ld29yayBmb3IgMTY4NzYyCi0gKiAyMDA3MDQyNSAgIDE4MzA0NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKiAyMDA3MDUwMSAgIDE4MDI4NCBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoCi0gKiAyMDA3MDUxMSAgIDE4NjQ0MCBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoIGZpeCAxODY0NDAKLSAqIDIwMDcwNTEzICAgMTg2NDMwIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIGZpeCBmb3IgMTg2NDMwCi0gKiAgICAgICAgICAgICAgICAgICAgICBUZXh0IG5vdCBhY2Nlc3NpYmxlIG9uIEFYSVMyIHdpemFyZCBwYWdlcy4KLSAqIDIwMDcwNTE2ICAgMTgzMTQ3IHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGggRml4IGZvciB0aGUgcGVyc2lzdGluZyBEQkNTIHBhdGhzCi0gKiAyMDA3MDUyMyAgIDE3NDg3NiBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBQZXJzaXN0IFByZWZlcmVuY2VzIGluc2lkZSBGcmFtZXdvcmsKLSAqIDIwMDcwNjAzICAgMTg4NzQwIHNhbmRha2l0aEB3c28yLmNvbSAtIExhaGlydSBTYW5kYWtpdGgsIAotICogMjAwNzA2MDQgICAxOTA1MDUgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgCi0gKiAyMDA3MDYwNCAgIDE5MDA2NyBwbW9vZ2tAY2EuaWJtLmNvbSAtIFBldGVyIE1vb2drCi0gKiAyMDA3MDgyNCAgIDIwMDUxNSBzYW5kYWtpdGhAd3NvMi5jb20gLSBMYWhpcnUgU2FuZGFraXRoLCBOT04tTkxTIG1vdmUgdG8gc2VwZXJhdGUgZmlsZQotICogMjAwNzA4MjcgICAxODg3MzIgc2FuZGFraXRoQHdzbzIuY29tIC0gTGFoaXJ1IFNhbmRha2l0aCwgUmVzdG9yZSBkZWZhdWx0cyBmb3IgcHJlZmVyZW5jZXMKLSAqIDIwMDcxMDMwCSAgMjA3NjE4IHppbmFAY2EuaWJtLmNvbSAtIFppbmEgTW9zdGFmaWEsIFBhZ2UgR1VJIHNlcXVlbmNlIHVzaW5nIHRhYiBpcyBub3QgY29ycmVjdCAoIHZpb2xhdGVzIEFjY2Vzc2liaWxpdHkpCi0gKiAyMDA4MDUyMiAgIDIzMzE1NCBzYW1pbmRhd0B3c28yLmNvbSAtIFNhbWluZGEgV2lqZXJhdG5lLCBVSSByZW5kZXJpbmcgcHJvYmxlbSB3aGVyZSB0ZXh0Ym94ZXMgdXNlZCBhcyBsYWJlbHMgaGFkIHdoaXRlIGJhY2tncm91bmQKLSAqIDIwMDkwMzA3ICAgMTk2OTU0IHNhbWluZGF3QHdzbzIuY29tIC0gU2FtaW5kYSBXaWplcmF0bmUsIFN1cHBvcnQgWE1MQmVhbnMgZGF0YSBiaW5kaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMyLmNvbnN1bXB0aW9uLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb25zdGFudC5BeGlzMkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb250ZXh0LkF4aXMyRW1pdHRlckNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUuY29udGV4dC5BeGlzMkVtaXR0ZXJEZWZhdWx0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5wbHVnaW4uV2ViU2VydmljZUF4aXMyQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5wbHVnaW4ubWVzc2FnZXMuQXhpczJDb3JlVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS51dGlscy5BeGlzMkNvcmVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS51dGlscy5SdW50aW1lUHJvcGVydHlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkucGx1Z2luLldlYlNlcnZpY2VBeGlzMlVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLQotcHVibGljIGNsYXNzIEF4aXMyUnVudGltZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCi0JcHJpdmF0ZSBUZXh0IGF4aXMyUGF0aDsgCi0JcHJpdmF0ZSBUZXh0IHN0YXR1c0xhYmVsOwotCXByaXZhdGUgQ29tYm8gYWFyRXh0ZW5zaW9uQ29tYm87IAotCXByaXZhdGUgQ29tYm8gc2VydmljZURhdGFiaW5kaW5nQ29tYm87Ci0JcHJpdmF0ZSBDb21ibyBjbGllbnREYXRhYmluZGluZ0NvbWJvOwotCXByaXZhdGUgQnV0dG9uIGdlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZUNoZWNrQm94QnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIGdlbmVyYXRlQWxsQ2hlY2tCb3hCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gc3luY0FuZEFzeW5jUmFkaW9CdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gc3luY09ubHlSYWRpb0J1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBhc3luY09ubHlSYWRpb0J1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBjbGllbnRUZXN0Q2FzZUNoZWNrQm94QnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIGNsaWVudEdlbmVyYXRlQWxsQ2hlY2tCb3hCdXR0b247Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgc3VwZXJwYXJlbnQpIHsKLQkJCi0JCVVJVXRpbHMgdWlVdGlscyA9IG5ldyBVSVV0aWxzKFdlYlNlcnZpY2VBeGlzMlVJUGx1Z2luLlBMVUdJTl9JRCk7Ci0JCWZpbmFsIENvbXBvc2l0ZSAgbWFpbkNvbXAgPSB1aVV0aWxzLmNyZWF0ZUNvbXBvc2l0ZShzdXBlcnBhcmVudCwgMSk7Ci0JCQotCQlUYWJGb2xkZXIgYXhpczJQcmVmZXJlbmNlVGFiID0gbmV3IFRhYkZvbGRlcihtYWluQ29tcCwgU1dULldSQVApOwotCQlheGlzMlByZWZlcmVuY2VUYWIuc2V0TGF5b3V0RGF0YSggbmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwgfCBHcmlkRGF0YS5GSUxMX0JPVEgpICk7Ci0JCWF4aXMyUHJlZmVyZW5jZVRhYi5zZXRCYWNrZ3JvdW5kKG1haW5Db21wLmdldEJhY2tncm91bmQoKSk7Ci0JCQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tQXhpczIgUnVudGltZSBMb2NhdGlvbiBHcm91cC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCi0JCVRhYkl0ZW0gcnVudGltZUluc3RhbExvY2F0aW9uSXRlbSA9IG5ldyBUYWJJdGVtKGF4aXMyUHJlZmVyZW5jZVRhYiwgU1dULldSQVApOwotCQlydW50aW1lSW5zdGFsTG9jYXRpb25JdGVtLnNldFRleHQoQXhpczJDb3JlVUlNZXNzYWdlcy5BWElTMl9SVU5USU1FKTsKLQkJcnVudGltZUluc3RhbExvY2F0aW9uSXRlbS5zZXRUb29sVGlwVGV4dChBeGlzMkNvcmVVSU1lc3NhZ2VzLkFYSVMyX1JVTlRJTUVfVE9PTFRJUCk7Ci0JCQotCQlDb21wb3NpdGUgcnVudGltZVRhYiA9IHVpVXRpbHMuY3JlYXRlQ29tcG9zaXRlKGF4aXMyUHJlZmVyZW5jZVRhYiwgMSk7Ci0JCXJ1bnRpbWVUYWIuc2V0TGF5b3V0RGF0YSggbmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwgfCBHcmlkRGF0YS5GSUxMX0JPVEggKSApOwotCQlDb21wb3NpdGUgcnVudGltZUdyb3VwID0gdWlVdGlscy5jcmVhdGVDb21wb3NpdGUocnVudGltZVRhYiwgMyk7Ci0JCXJ1bnRpbWVUYWIuc2V0QmFja2dyb3VuZChheGlzMlByZWZlcmVuY2VUYWIuZ2V0QmFja2dyb3VuZCgpKTsKLQkJIAotCQlydW50aW1lSW5zdGFsTG9jYXRpb25JdGVtLnNldENvbnRyb2wocnVudGltZVRhYik7Ci0JCXJ1bnRpbWVUYWIuc2V0VG9vbFRpcFRleHQoQXhpczJDb3JlVUlNZXNzYWdlcy5BWElTMl9SVU5USU1FX1RPT0xUSVApOwotCi0JCWF4aXMyUGF0aCA9IHVpVXRpbHMuY3JlYXRlVGV4dChydW50aW1lR3JvdXAsIEF4aXMyQ29yZVVJTWVzc2FnZXMuQVhJUzJfUlVOVElNRV9MT0NBVElPTiAsIG51bGwsIG51bGwgLCBTV1QuQk9SREVSKTsKLQkJCi0JCUJ1dHRvbiBicm93c2VCdXR0b24gPSB1aVV0aWxzLmNyZWF0ZVB1c2hCdXR0b24ocnVudGltZUdyb3VwLCBBeGlzMkNvcmVVSU1lc3NhZ2VzLkxBQkVMX0JST1VTRSwgbnVsbCwgbnVsbCk7Ci0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciggbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlQnJvd3NlKG1haW5Db21wLmdldFNoZWxsKCkpOwotCQkJfSAgICAgCi0JCX0pOyAKLQotCQlheGlzMlBhdGguYWRkTW9kaWZ5TGlzdGVuZXIoIG5ldyBNb2RpZnlMaXN0ZW5lcigpewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKXsKLQkJCQlzdGF0dXNVcGRhdGUocnVudGltZUV4aXN0KGF4aXMyUGF0aC5nZXRUZXh0KCkpKTsKLQkJCQkvLyBydW50aW1lVGFiLmxheW91dCgpOwotCQkJfQotCQl9KTsKLQkJbmV3IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsKHJ1bnRpbWVUYWIsIFNXVC5IT1JJWk9OVEFMKTsgIC8vIExlYXZlIHNvbWUgdmVydGljYWwgc3BhY2UuCi0JCXN0YXR1c0xhYmVsID0gbmV3IFRleHQocnVudGltZVRhYiwgU1dULkJBQ0tHUk9VTkQgfCBTV1QuUkVBRF9PTkxZIHwgU1dULkNFTlRFUiB8IFNXVC5XUkFQIHwgU1dULkhfU0NST0xMKTsKLQkJc3RhdHVzTGFiZWwuc2V0TGF5b3V0RGF0YSggbmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwgfCBHcmlkRGF0YS5GSUxMX0JPVEgpICk7Ci0JCXN0YXR1c0xhYmVsLnNldEJhY2tncm91bmQoYXhpczJQcmVmZXJlbmNlVGFiLmdldEJhY2tncm91bmQoKSk7Ci0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUF4aXMyIFJ1bnRpbWUgUHJlZmVyZW5jZXMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwotCi0JCVRhYkl0ZW0gY29kZWdlblByZWZlcmVuY2VzSXRlbSA9IG5ldyBUYWJJdGVtKGF4aXMyUHJlZmVyZW5jZVRhYiwgU1dULldSQVApOwotCQljb2RlZ2VuUHJlZmVyZW5jZXNJdGVtLnNldFRleHQoQXhpczJDb3JlVUlNZXNzYWdlcy5BWElTMl9QUkVGRVJFTkNFUyk7Ci0JCWNvZGVnZW5QcmVmZXJlbmNlc0l0ZW0uc2V0VG9vbFRpcFRleHQoQXhpczJDb3JlVUlNZXNzYWdlcy5BWElTMl9QUkVGRVJFTkNFU19UT09MVElQKTsKLQotCQlDb21wb3NpdGUgY29kZWdlbkdyb3VwID0gdWlVdGlscy5jcmVhdGVDb21wb3NpdGUoYXhpczJQcmVmZXJlbmNlVGFiLCAxKTsKLQkJY29kZWdlblByZWZlcmVuY2VzSXRlbS5zZXRDb250cm9sKGNvZGVnZW5Hcm91cCk7Ci0JCWNvZGVnZW5Hcm91cC5zZXRUb29sVGlwVGV4dChBeGlzMkNvcmVVSU1lc3NhZ2VzLkFYSVMyX1BSRUZFUkVOQ0VTX1RPT0xUSVApOwotCQljb2RlZ2VuR3JvdXAuc2V0QmFja2dyb3VuZChtYWluQ29tcC5nZXRCYWNrZ3JvdW5kKCkpOwotCQkKLQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0JCS8vU2VydmljZSBDb2RlZ2VuIE9wdGlvbnMKLQkJQ29tcG9zaXRlIHNlcnZpY2VDb2RlZ2VuR3JvdXAgPSB1aVV0aWxzLmNyZWF0ZUNvbXBvc2l0ZShjb2RlZ2VuR3JvdXAsIDEpOwotCi0JCVRleHQgc2VydmljZUNvZGVnZW5Hcm91cExhYmVsPSBuZXcgVGV4dChzZXJ2aWNlQ29kZWdlbkdyb3VwLCBTV1QuUkVBRF9PTkxZIHxTV1QuV1JBUCk7Ci0JCXNlcnZpY2VDb2RlZ2VuR3JvdXBMYWJlbC5zZXRUZXh0KEF4aXMyQ29yZVVJTWVzc2FnZXMuTEFCRUxfV0VCX1NFUlZJQ0VfQ09ERUdFTik7Ci0JCXNlcnZpY2VDb2RlZ2VuR3JvdXBMYWJlbC5zZXRCYWNrZ3JvdW5kKGF4aXMyUHJlZmVyZW5jZVRhYi5nZXRCYWNrZ3JvdW5kKCkpOwotCQkKLQkJQ29tcG9zaXRlIGRhdGFCaW5kQ29tcCA9IHVpVXRpbHMuY3JlYXRlQ29tcG9zaXRlKHNlcnZpY2VDb2RlZ2VuR3JvdXAsIDIpOwotCQkvL0RhdGEgYmluZGluZwotCQlzZXJ2aWNlRGF0YWJpbmRpbmdDb21ibyA9IHVpVXRpbHMuY3JlYXRlQ29tYm8oZGF0YUJpbmRDb21wLCBBeGlzMkNvcmVVSU1lc3NhZ2VzLkxBQkVMX0RBVEFCSU5ESU5HLCBudWxsLCBudWxsLCBTV1QuUkVBRF9PTkxZKTsKLQotCQkvL3RoZSBzZXJ2ZXIgc2lkZSBpbnRlcmZhY2Ugb3B0aW9uCi0JCWdlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZUNoZWNrQm94QnV0dG9uID0gdWlVdGlscy5jcmVhdGVDaGVja2JveChzZXJ2aWNlQ29kZWdlbkdyb3VwLCBBeGlzMkNvcmVVSU1lc3NhZ2VzLkxBQkVMX0dFTkVSQVRFX1NFUlZFUlNJREVfSU5URVJGQUNFLCBudWxsLCBudWxsKTsKLQotCQkvLyBnZW5lcmF0ZSBhbGwKLQkJZ2VuZXJhdGVBbGxDaGVja0JveEJ1dHRvbiA9IHVpVXRpbHMuY3JlYXRlQ2hlY2tib3goc2VydmljZUNvZGVnZW5Hcm91cCwgQXhpczJDb3JlVUlNZXNzYWdlcy5MQUJFTF9HRU5FUkFURV9BTEwsIG51bGwsbnVsbCk7Ci0KLQkJdWlVdGlscy5jcmVhdGVIb3Jpem9udGFsU2VwYXJhdG9yKGNvZGVnZW5Hcm91cCwyKTsKLQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0JCS8vL0NsaWVudCBDb2RlZ2VuIE9wdGlvbnMKLQkJQ29tcG9zaXRlIGNsaWVudENvZGVnZW5Hcm91cCA9IHVpVXRpbHMuY3JlYXRlQ29tcG9zaXRlKGNvZGVnZW5Hcm91cCwgMSk7Ci0JCVRleHQgY2xpZW50Q29kZWdlbkdyb3VwTGFiZWw9IG5ldyBUZXh0KGNsaWVudENvZGVnZW5Hcm91cCwgU1dULlJFQURfT05MWSk7Ci0JCWNsaWVudENvZGVnZW5Hcm91cExhYmVsLnNldFRleHQoQXhpczJDb3JlVUlNZXNzYWdlcy5MQUJFTF9XRUJfU0VSVklDRV9DTElFTlRfQ09ERUdFTik7Ci0JCWNsaWVudENvZGVnZW5Hcm91cExhYmVsLnNldEJhY2tncm91bmQoYXhpczJQcmVmZXJlbmNlVGFiLmdldEJhY2tncm91bmQoKSk7Ci0JCQotCQlHcm91cCBjbGllbnRNb2RlUmFkaW9Db21wID0gdWlVdGlscy5jcmVhdGVHcm91cChjbGllbnRDb2RlZ2VuR3JvdXAsIEF4aXMyQ29yZVVJTWVzc2FnZXMuTEFCRUxfQ0xJRU5UX1NJREUsIG51bGwsIG51bGwpOwotCi0JCS8vY2xpZW50IHNpZGUgYnV0dG9ucwotCQlzeW5jQW5kQXN5bmNSYWRpb0J1dHRvbiA9IHVpVXRpbHMuY3JlYXRlUmFkaW9CdXR0b24oY2xpZW50TW9kZVJhZGlvQ29tcCwgQXhpczJDb3JlVUlNZXNzYWdlcy5MQUJFTF9TWU5DX0FORF9BU1lOQywgbnVsbCwgbnVsbCk7Ci0JCXN5bmNPbmx5UmFkaW9CdXR0b24gCT0gdWlVdGlscy5jcmVhdGVSYWRpb0J1dHRvbihjbGllbnRNb2RlUmFkaW9Db21wLEF4aXMyQ29yZVVJTWVzc2FnZXMuTEFCRUxfU1lOQywgbnVsbCwgbnVsbCk7Ci0JCWFzeW5jT25seVJhZGlvQnV0dG9uIAk9IHVpVXRpbHMuY3JlYXRlUmFkaW9CdXR0b24oY2xpZW50TW9kZVJhZGlvQ29tcCwgQXhpczJDb3JlVUlNZXNzYWdlcy5MQUJFTF9BU1lOQywgbnVsbCwgbnVsbCk7Ci0KLQkJQ29tcG9zaXRlIGRhdGFCaW5kID0gdWlVdGlscy5jcmVhdGVDb21wb3NpdGUoY2xpZW50Q29kZWdlbkdyb3VwLCAyKTsKLQkJY2xpZW50RGF0YWJpbmRpbmdDb21ibyA9IHVpVXRpbHMuY3JlYXRlQ29tYm8oZGF0YUJpbmQsIEF4aXMyQ29yZVVJTWVzc2FnZXMuTEFCRUxfREFUQUJJTkRJTkcsIG51bGwsIG51bGwsIFNXVC5SRUFEX09OTFkpOwotCi0JCS8vIGdlbmVyYXRlIHRlc3QgY2FzZSBvcHRpb24KLQkJY2xpZW50VGVzdENhc2VDaGVja0JveEJ1dHRvbiA9IHVpVXRpbHMuY3JlYXRlQ2hlY2tib3goY2xpZW50Q29kZWdlbkdyb3VwLCBBeGlzMkNvcmVVSU1lc3NhZ2VzLkxBQkVMX0dFTkVSQVRFX1RFU1RDQVNFX0NBUFRJT04sIG51bGwsIG51bGwpOwotCi0JCS8vIGdlbmVyYXRlIGFsbAotCQljbGllbnRHZW5lcmF0ZUFsbENoZWNrQm94QnV0dG9uID0gdWlVdGlscy5jcmVhdGVDaGVja2JveChjbGllbnRDb2RlZ2VuR3JvdXAsIEF4aXMyQ29yZVVJTWVzc2FnZXMuTEFCRUxfR0VORVJBVEVfQUxMLCBudWxsLCBudWxsKTsKLQotCi0JCXVpVXRpbHMuY3JlYXRlSG9yaXpvbnRhbFNlcGFyYXRvcihjb2RlZ2VuR3JvdXAsMik7Ci0KLQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0JCS8vL0FBUiBPcHRpb25zCi0JCUNvbXBvc2l0ZSBhYXJHcm91cCA9IHVpVXRpbHMuY3JlYXRlQ29tcG9zaXRlKGNvZGVnZW5Hcm91cCwxKTsKLQotCQlUZXh0IGFyckdyb3VwTGFiZWw9IG5ldyBUZXh0KGFhckdyb3VwLCBTV1QuUkVBRF9PTkxZKTsKLQkJYXJyR3JvdXBMYWJlbC5zZXRUZXh0KEF4aXMyQ29yZVVJTWVzc2FnZXMuTEFCRUxfV0VCX1NFUlZJQ0VfQUFSKTsKLQkJYXJyR3JvdXBMYWJlbC5zZXRCYWNrZ3JvdW5kKGF4aXMyUHJlZmVyZW5jZVRhYi5nZXRCYWNrZ3JvdW5kKCkpOwotCQkKLQkJQ29tcG9zaXRlIGFhckV4dEdyb3VwID0gdWlVdGlscy5jcmVhdGVDb21wb3NpdGUoYWFyR3JvdXAsMik7Ci0KLQkJLy9hYXIgZXh0ZW50aW9uIAotCQlhYXJFeHRlbnNpb25Db21ibyA9IHVpVXRpbHMuY3JlYXRlQ29tYm8oYWFyRXh0R3JvdXAsIEF4aXMyQ29yZVVJTWVzc2FnZXMuTEFCRUxfQUFSX0VYVEVOVElPTiwgbnVsbCwgbnVsbCwgU1dULlJFQURfT05MWSApOwotCi0JCWluaXRpYWxpemVWYWx1ZXMoKTsKLQkJYXhpczJQcmVmZXJlbmNlVGFiLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCWF4aXMyUHJlZmVyZW5jZVRhYi5zZXRWaXNpYmxlKHRydWUpOwotCQlyZXR1cm4gbWFpbkNvbXA7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCX0KLQotCi0JLyoqCi0JICogUG9wcyB1cCB0aGUgZmlsZSBicm93c2UgZGlhbG9nIGJveAotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVCcm93c2UoU2hlbGwgcGFyZW50KSB7Ci0JCURpcmVjdG9yeURpYWxvZyBmaWxlRGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhwYXJlbnQpOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBmaWxlRGlhbG9nLm9wZW4oKTsKLQkJaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKLQkJCWF4aXMyUGF0aC5zZXRUZXh0KGZpbGVOYW1lKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzdGF0dXNVcGRhdGUoYm9vbGVhbiBzdGF0dXMpewotCQlpZihzdGF0dXNMYWJlbCAhPSBudWxsKXsKLQkJCWlmKCFheGlzMlBhdGguZ2V0VGV4dCgpLmVxdWFscygiIikpewotCQkJCWlmIChzdGF0dXMpIHsKLQkJCQkJc3RhdHVzTGFiZWwuc2V0VGV4dChBeGlzMkNvcmVVSU1lc3NhZ2VzLkxBQkVMX0FYSVMyX1JVTlRJTUVfTE9BRCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3RhdHVzTGFiZWwuc2V0VGV4dChBeGlzMkNvcmVVSU1lc3NhZ2VzLkxBQkVMX0FYSVMyX1JVTlRJTUVfTE9BRF9FUlJPUik7Ci0JCQkJfQotCQkJfWVsc2V7Ci0JCQkJc3RhdHVzTGFiZWwuc2V0VGV4dChBeGlzMkNvcmVVSU1lc3NhZ2VzLkxBQkVMX0FYSVMyX1JVTlRJTUVfTk9UX0VYSVQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHJ1bnRpbWVFeGlzdChTdHJpbmcgcGF0aCl7Ci0KLQkJRmlsZSBheGlzMkhvbWVEaXIgPSBuZXcgRmlsZShwYXRoKTsKLQkJaWYgKCFheGlzMkhvbWVEaXIuaXNEaXJlY3RvcnkoKSkgCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJU3RyaW5nIGF4aXMyTGliUGF0aCA9IEF4aXMyQ29yZVV0aWxzLmFkZEFub3RoZXJOb2RlVG9QYXRoKGF4aXMySG9tZURpci5nZXRBYnNvbHV0ZVBhdGgoKSwgImxpYiIpOwotCQlTdHJpbmcgYXhpczJXZWJhcHBQYXRoID0gQXhpczJDb3JlVXRpbHMuYWRkQW5vdGhlck5vZGVUb1BhdGgoYXhpczJIb21lRGlyLmdldEFic29sdXRlUGF0aCgpLCAid2ViYXBwIik7Ci0JCWlmIChuZXcgRmlsZShheGlzMkxpYlBhdGgpLmlzRGlyZWN0b3J5KCkgJiYgbmV3IEZpbGUoYXhpczJXZWJhcHBQYXRoKS5pc0RpcmVjdG9yeSgpKSAKLQkJCXJldHVybiB0cnVlOwotCQllbHNlIHsKLQkJCVN0cmluZyBheGlzMldhclBhdGggPSBBeGlzMkNvcmVVdGlscy5hZGRBbm90aGVyTm9kZVRvUGF0aCggcGF0aCwgImF4aXMyLndhciIpOwotCQkJaWYgKG5ldyBGaWxlKGF4aXMyV2FyUGF0aCkuaXNGaWxlKCkpIHsKLQkJCQlSdW50aW1lUHJvcGVydHlVdGlscy53cml0ZVdhclN0YXVzVG9Qcm9wZXJ0aWVzRmlsZSh0cnVlKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSAJCQkJCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0b3JlVmFsdWVzKCl7Ci0JCS8vIHNldCB2YWx1ZXMgaW4gdGhlIHBlcnNpc3RlbnQgY29udGV4dCAKLQkJQXhpczJFbWl0dGVyQ29udGV4dCBjb250ZXh0ID0gV2ViU2VydmljZUF4aXMyQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QXhpc0VtaXR0ZXJDb250ZXh0KCk7Ci0JCWNvbnRleHQuc2V0QXhpczJSdW50aW1lTG9jYXRpb24oIGF4aXMyUGF0aC5nZXRUZXh0KCkpOwotCQlSdW50aW1lUHJvcGVydHlVdGlscy53cml0ZVNlcnZlclBhdGhUb1Byb3BlcnRpZXNGaWxlKGF4aXMyUGF0aC5nZXRUZXh0KCkpOwotCQljb250ZXh0LnNldFNlcnZpY2VEYXRhYmluZGluZyhzZXJ2aWNlRGF0YWJpbmRpbmdDb21iby5nZXRJdGVtKHNlcnZpY2VEYXRhYmluZGluZ0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpKTsKLQkJY29udGV4dC5zZXRTZXJ2aWNlSW50ZXJmYWNlU2tlbGV0b24oIGdlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZUNoZWNrQm94QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJY29udGV4dC5zZXRTZXJ2aWNlR2VuZXJhdGVBbGwoZ2VuZXJhdGVBbGxDaGVja0JveEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCWNvbnRleHQuc2V0QXN5bmMoYXN5bmNPbmx5UmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQljb250ZXh0LnNldFN5bmMoc3luY09ubHlSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCWNvbnRleHQuc2V0Q2xpZW50RGF0YWJpbmRpbmcoY2xpZW50RGF0YWJpbmRpbmdDb21iby5nZXRJdGVtKGNsaWVudERhdGFiaW5kaW5nQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSkpOwotCQljb250ZXh0LnNldENsaWVudFRlc3RDYXNlKGNsaWVudFRlc3RDYXNlQ2hlY2tCb3hCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQljb250ZXh0LnNldENsaWVudEdlbmVyYXRlQWxsKGNsaWVudEdlbmVyYXRlQWxsQ2hlY2tCb3hCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQljb250ZXh0LnNldEFhckV4dGVudGlvbihhYXJFeHRlbnNpb25Db21iby5nZXRUZXh0KCkpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgdXNpbmcgZGVmYXVsdCB2YWx1ZXMKLQkgKiBpbiB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRzKCkgewotCQlhYXJFeHRlbnNpb25Db21iby5zZWxlY3QoMCk7Ci0JCXNlcnZpY2VEYXRhYmluZGluZ0NvbWJvLnNlbGVjdCgwKTsKLQkJY2xpZW50RGF0YWJpbmRpbmdDb21iby5zZWxlY3QoMCk7Ci0JCWdlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZUNoZWNrQm94QnV0dG9uLnNldFNlbGVjdGlvbihBeGlzMkVtaXR0ZXJEZWZhdWx0cy5pc1NlcnZpY2VJbnRlcmZhY2VTa2VsZXRvbigpKTsKLQkJZ2VuZXJhdGVBbGxDaGVja0JveEJ1dHRvbi5zZXRTZWxlY3Rpb24oQXhpczJFbWl0dGVyRGVmYXVsdHMuaXNTZXJ2aWNlR2VuZXJhdGVBbGwoKSk7Ci0JCXN5bmNBbmRBc3luY1JhZGlvQnV0dG9uLnNldFNlbGVjdGlvbigoKEF4aXMyRW1pdHRlckRlZmF1bHRzLmlzQ2xpZW50U3luYygpIHx8IEF4aXMyRW1pdHRlckRlZmF1bHRzLmlzQ2xpZW50QXN5bmMoKSk9PWZhbHNlKT90cnVlOgotCQkJKEF4aXMyRW1pdHRlckRlZmF1bHRzLmlzQ2xpZW50U3luYygpKSAmJiBBeGlzMkVtaXR0ZXJEZWZhdWx0cy5pc0NsaWVudEFzeW5jKCkpOwotCQlzeW5jT25seVJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbiggQXhpczJFbWl0dGVyRGVmYXVsdHMuaXNDbGllbnRTeW5jKCkgJiYgIUF4aXMyRW1pdHRlckRlZmF1bHRzLmlzQ2xpZW50QXN5bmMoKSk7Ci0JCWFzeW5jT25seVJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbigKLQkJCQlBeGlzMkVtaXR0ZXJEZWZhdWx0cy5pc0NsaWVudEFzeW5jKCkgJiYgIUF4aXMyRW1pdHRlckRlZmF1bHRzLmlzQ2xpZW50U3luYygpKTsKLQotCQljbGllbnRUZXN0Q2FzZUNoZWNrQm94QnV0dG9uLnNldFNlbGVjdGlvbihBeGlzMkVtaXR0ZXJEZWZhdWx0cy5pc0NsaWVudFRlc3RDYXNlKCkpOwotCQljbGllbnRHZW5lcmF0ZUFsbENoZWNrQm94QnV0dG9uLnNldFNlbGVjdGlvbihBeGlzMkVtaXR0ZXJEZWZhdWx0cy5pc0NsaWVudEdlbmVyYXRlQWxsKCkpOwotCQlheGlzMlBhdGguc2V0VGV4dChBeGlzMkVtaXR0ZXJEZWZhdWx0cy5nZXRBeGlzMlJ1bnRpbWVMb2NhdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpCi0JewotCQlBeGlzMkVtaXR0ZXJDb250ZXh0IGNvbnRleHQgPSBXZWJTZXJ2aWNlQXhpczJDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRBeGlzRW1pdHRlckNvbnRleHQoKTsKLQotCQlTdHJpbmdbXSBkYXRhYmluZGluZ0l0ZW1zID0ge0F4aXMyQ29uc3RhbnRzLkRBVEFfQklORElOR19BREIsQXhpczJDb25zdGFudHMuREFUQV9CSU5ESU5HX1hNTEJFQU5TfTsKLQkJc2VydmljZURhdGFiaW5kaW5nQ29tYm8uc2V0SXRlbXMoZGF0YWJpbmRpbmdJdGVtcyk7Ci0JCWludCBzZWxlY3RlZCA9IHNlcnZpY2VEYXRhYmluZGluZ0NvbWJvLmluZGV4T2YoY29udGV4dC5nZXRTZXJ2aWNlRGF0YWJpbmRpbmcoKS50b1VwcGVyQ2FzZSgpKTsKLQkJaWYgKHNlbGVjdGVkPT0tMSkKLQkJCXNlcnZpY2VEYXRhYmluZGluZ0NvbWJvLnNlbGVjdCgwKTsKLQkJZWxzZQotCQkJc2VydmljZURhdGFiaW5kaW5nQ29tYm8uc2VsZWN0KHNlbGVjdGVkKTsKLQkJY2xpZW50RGF0YWJpbmRpbmdDb21iby5zZXRJdGVtcyhkYXRhYmluZGluZ0l0ZW1zKTsKLQkJc2VsZWN0ZWQgPSBjbGllbnREYXRhYmluZGluZ0NvbWJvLmluZGV4T2YoY29udGV4dC5nZXRDbGllbnREYXRhYmluZGluZygpLnRvVXBwZXJDYXNlKCkpOwotCQlpZiAoc2VsZWN0ZWQ9PS0xKQotCQkJY2xpZW50RGF0YWJpbmRpbmdDb21iby5zZWxlY3QoMCk7Ci0JCWVsc2UKLQkJCWNsaWVudERhdGFiaW5kaW5nQ29tYm8uc2VsZWN0KHNlbGVjdGVkKTsKLQotCQlnZW5lcmF0ZVNlcnZlclNpZGVJbnRlcmZhY2VDaGVja0JveEJ1dHRvbi5zZXRTZWxlY3Rpb24oIGNvbnRleHQuaXNTZXJ2aWNlSW50ZXJmYWNlU2tlbGV0b24oKSk7Ci0JCWdlbmVyYXRlQWxsQ2hlY2tCb3hCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNTZXJ2aWNlR2VuZXJhdGVBbGwoKSk7Ci0KLQkJc3luY0FuZEFzeW5jUmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKCgoY29udGV4dC5pc1N5bmMoKSB8fCBjb250ZXh0LmlzQXN5bmMoKSk9PWZhbHNlKSA/dHJ1ZQotCQkJCTooY29udGV4dC5pc1N5bmMoKSkgJiYgY29udGV4dC5pc0FzeW5jKCkpOwotCQlzeW5jT25seVJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzU3luYygpICYmICFjb250ZXh0LmlzQXN5bmMoKSApOwotCQlhc3luY09ubHlSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0FzeW5jKCkgJiYgIWNvbnRleHQuaXNTeW5jKCkpOwotCi0JCWNsaWVudFRlc3RDYXNlQ2hlY2tCb3hCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNDbGllbnRUZXN0Q2FzZSgpKTsKLQkJY2xpZW50R2VuZXJhdGVBbGxDaGVja0JveEJ1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0NsaWVudEdlbmVyYXRlQWxsKCkpOwotCi0JCVN0cmluZ1tdIGFhckV4dGVudGlvbkl0ZW1zID0geyBBeGlzMkNvbnN0YW50cy5BQVIgfTsKLQkJYWFyRXh0ZW5zaW9uQ29tYm8uc2V0SXRlbXMoYWFyRXh0ZW50aW9uSXRlbXMpOwotCQlhYXJFeHRlbnNpb25Db21iby5zZWxlY3QoMCk7Ci0JCQotCQlTdHJpbmcgc2VydmVyUGF0aCA9IGNvbnRleHQuZ2V0QXhpczJSdW50aW1lTG9jYXRpb24oKTsKLQkJaWYgKCBzZXJ2ZXJQYXRoICE9IG51bGwpewotCQkJYXhpczJQYXRoLnNldFRleHQoc2VydmVyUGF0aCk7Ci0JCQlzdGF0dXNVcGRhdGUocnVudGltZUV4aXN0KHNlcnZlclBhdGgpKTsKLQkJCVJ1bnRpbWVQcm9wZXJ0eVV0aWxzLndyaXRlV2FyU3RhdXNUb1Byb3BlcnRpZXNGaWxlKGZhbHNlKTsKLQkJfQotCQllbHNlCi0JCQlzdGF0dXNVcGRhdGUoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJaW5pdGlhbGl6ZURlZmF1bHRzKCk7Ci0JfQotCi0JLyoqCi0JICogQXBwbHkgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFwcGx5KCkgewotCQlwZXJmb3JtT2soKTsKLQl9Ci0KLQkvKioKLQkgKiBPSyBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLQkgKi8JCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlzdG9yZVZhbHVlcygpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyLy5jdnNpZ25vcmUgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDAxNTkyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLW9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlcl8qCi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyLy5wcm9qZWN0IGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYzAzMGQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci9Eb2NCdWlsZC54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci9Eb2NCdWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMzVhMWYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvRG9jQnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Ci08IS0tIAotCi0JVGhpcyBzY3JpcHQgYnVpbGQgdGhlIEhlbHAgcGx1Zy1pbiBieSB0cmFuc2Zvcm1pbmcgdGhlIERJVEEgc291cmNlIGZpbGVzIGludG8gSFRNTC4KLQkKLQlUbyB1c2UgdGhpcyBzY3JpcHQsIHlvdSBtdXN0IGluc3RhbGwgRElUQS1PVCBvbiB5b3VyIG1hY2hpbmUgaW4gdGhlIGRpcmVjdG9yeQotCWRlZmluZWQgYnkgdGhlIGRpdGEub3QuZGlyIHByb3BlcnR5LgotCQotCVJ1biB0aGUgZGVmYXVsdCB0YXJnZXQgYWZ0ZXIgeW91IGVkaXQgdGhlIERJVEEgc291cmNlIGZpbGVzIHRvIHJlZ2VuZXJhdGUgdGhlIEhUTUwuCi0JCi0JVG8gY3VzdG9taXplIHRoaXMgc2NyaXB0IGZvciBvdGhlciBIZWxwIHBsdWctaW5zLCBtb2RpZnkgdGhlIHZhbHVlIG9mIHRoZSBhcmdzLmlucHV0IHByb3BlcnR5Ci0JdG8gYmUgdGhlIERJVEEgbWFwIGZpbGUgZm9yIHRoZSBwbHVnLWluLgotCQotCU5PVEU6IFRoaXMgc2NyaXB0IGFzc3VtZXMgdGhhdCBsaW5rcyB0byBzaWJsaW5nIEhlbHAgcGx1Zy1pbnMgaGF2ZSBzY29wZT0icGVlciIsIG90aGVyd2lzZSB0aGUKLQlvdXRwdXQgZGlyZWN0b3J5IHN0cnVjdHVyZSB3aWxsIGJlIHNoaWZ0ZWQgaW5jb3JyZWN0bHkuCi0JCi0JTk9URTogVGhpcyBzY3JpcHQgYXNzdW1lcyB0aGF0IHlvdSBoYW5kIGNvZGUgeW91ciBwbHVnaW4ueG1sIGZpbGUgaW4gbXlwbHVnaW4ueG1sLiBUaGlzIGZpbGUKLQl3aWxsIGJlIGNvcGllZCBvdmVyIHRoZSBnZW5lcmF0ZWQgcGx1Z2luLnhtbCB3aGljaCBpcyBjdXJyZW50bHkgbm90IGJlaW5nIGdlbmVyYXRlZCBjb3JyZWN0bHkKLQlieSBESVRBLU9ULgotCQotCUNoYW5nZUxvZzoKLQkyMDA2LTA0LTA1IEFydGh1ciBSeW1hbiA8cnltYW5AY2EuaWJtLmNvbT4KLQktIENyZWF0ZWQuCi0JMjAwOC0wMS0wOSBLYXRlIFByaWNlIDxrYXRlcEBjYS5pYm0uY29tPgotCS0gbW9kaWZpZWQgZm9yIG5ldyBESVRBLU9UIHZlcnNpb24KLQkyMDA4LTA1LTA1IEthdGUgUHJpY2UgPGthdGVwQGNhLmlibS5jb20+Ci0JLSBtb2RpZmllZCB0byBhZGQgZ2VuZXJhdGlvbiBvZiBwcmUtYnVpbHQgaGVscCBpbmRleC4gCi0JLSBNdXN0IGRlbGV0ZSAvaW5kZXggZm9sZGVyIGJlZm9yZSBydW5uaW5nIGJ1aWxkCQotLS0+Ci08cHJvamVjdCBuYW1lPSJlY2xpcHNlaGVscCIgZGVmYXVsdD0iYWxsIj4KLQotCTxwcm9wZXJ0eSBuYW1lPSJkaXRhLm90LmRpciIgbG9jYXRpb249IkM6L0RJVEEtT1QxLjIuMiIgLz4KLQotCTxwYXRoIGlkPSJkb3N0LmNsYXNzLnBhdGgiPgotCQk8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7ZGl0YS5vdC5kaXJ9JHtmaWxlLnNlcGFyYXRvcn1saWIke2ZpbGUuc2VwYXJhdG9yfWRvc3QuamFyIiAvPgotCTwvcGF0aD4KLQotCTx0YXNrZGVmIG5hbWU9ImludGVncmF0ZSIgY2xhc3NuYW1lPSJvcmcuZGl0YS5kb3N0LnBsYXRmb3JtLkludGVncmF0b3JUYXNrIj4KLQkJPGNsYXNzcGF0aCByZWZpZD0iZG9zdC5jbGFzcy5wYXRoIiAvPgotCTwvdGFza2RlZj4KLQk8dGFyZ2V0IG5hbWU9ImFsbCIgZGVwZW5kcz0iaW50ZWdyYXRlLCBlY2xpcHNlaGVscCI+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJpbnRlZ3JhdGUiPgotCQk8aW50ZWdyYXRlIGRpdGFkaXI9IiR7ZGl0YS5vdC5kaXJ9IiAvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSByZXZpc2UgYmVsb3cgaGVyZSAtLT4KLQk8dGFyZ2V0IG5hbWU9ImVjbGlwc2VoZWxwIj4KLQkJPGFudCBhbnRmaWxlPSIke2RpdGEub3QuZGlyfSR7ZmlsZS5zZXBhcmF0b3J9Y29uZHVjdG9yLnhtbCIgdGFyZ2V0PSJpbml0IiBkaXI9IiR7ZGl0YS5vdC5kaXJ9Ij4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzLmNvcHljc3MiIHZhbHVlPSJubyIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzLmNzc3BhdGgiIHZhbHVlPSIuLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5lY2xpcHNlLnByb3ZpZGVyIiB2YWx1ZT0iRWNsaXBzZS5vcmciIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5lY2xpcHNlLnZlcnNpb24iIHZhbHVlPSIzLjMuMCIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzLmlucHV0IiBsb2NhdGlvbj0id3NheGlzMmJ1aWxkX3RvYy5kaXRhbWFwIiAvPiAgIAotCQkJPHByb3BlcnR5IG5hbWU9ImNsZWFuLnRlbXAiIHZhbHVlPSJ0cnVlIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9ImRpdGEuZXh0bmFtZSIgdmFsdWU9Ii5kaXRhIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9ImRpdGEudGVtcC5kaXIiIGxvY2F0aW9uPSJ0ZW1wIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9Im91dHB1dC5kaXIiIGxvY2F0aW9uPSIiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0idHJhbnN0eXBlIiB2YWx1ZT0iZWNsaXBzZWhlbHAiIC8+Ci0JCTwvYW50PgotCQk8Y29weSBmaWxlPSJteXBsdWdpbi54bWwiIHRvZmlsZT0icGx1Z2luLnhtbCIgb3ZlcndyaXRlPSJ5ZXMiIC8+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJidWlsZC5pbmRleCIgZGVzY3JpcHRpb249IkJ1aWxkcyBzZWFyY2ggaW5kZXggZm9yIHRoZSBwbHVnLWluIiBpZj0iZWNsaXBzZS5ydW5uaW5nIj4KLQkgICAgIDxoZWxwLmJ1aWxkSGVscEluZGV4IG1hbmlmZXN0PSJwbHVnaW4ueG1sIiBkZXN0aW5hdGlvbj0iLiIvPgotCTwvdGFyZ2V0PgkKLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZTU5NjkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXI7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjEucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvYWJvdXQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZjU3NDguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgd3NheGlzMmJ1aWxkX3RvYy54bWwsXAotICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyaW5kZXgueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGluZGV4LyxcCi0gICAgICAgICAgICAgICB0b3BpY3MvCi1zcmMuaW5jbHVkZXMgPSAqLm1hcGxpc3QsXAotICAgICAgICAgICAgICAgKi5kaXRhbWFwLFwKLSAgICAgICAgICAgICAgIHRvcGljcy8sXAotICAgICAgICAgICAgICAgd3NheGlzMmJ1aWxkX3RvYy54bWwsXAotICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyaW5kZXgueG1sLFwKLSAgICAgICAgICAgICAgIGluZGV4LwotYmluLmV4Y2x1ZGVzID0gRG9jQnVpbGQueG1sLFwKLSAgICAgICAgICAgICAgIG15UGx1Z2luKi54bWwsXAotICAgICAgICAgICAgICAgdG9waWNzLyouZGl0YQotZ2VuZXJhdGVTb3VyY2VCdW5kbGU9ZmFsc2UKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL2luZGV4L180LmNmcyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL2luZGV4L180LmNmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc3NzQwZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci9pbmRleC9fNC5jZnMKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci9pbmRleC9kZWxldGFibGUgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci9pbmRleC9kZWxldGFibGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5M2Y0NzAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvaW5kZXgvZGVsZXRhYmxlCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9jb250cmlidXRpb25zIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9jb250cmlidXRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWI1Y2VhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfY29udHJpYnV0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1RoaXMgaXMgYSBnZW5lcmF0ZWQgZmlsZTsgZG8gbm90IGVkaXQuDQotI1RodSBNYXkgMTUgMTc6Mzc6NTAgRURUIDIwMDgNCi1vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXI9b3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyXG4xLjAuMC5xdWFsaWZpZXINCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci9pbmRleC9pbmRleGVkX2RlcGVuZGVuY2llcyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfZGVwZW5kZW5jaWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDQ1MTRkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfZGVwZW5kZW5jaWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jVGhpcyBpcyBhIGdlbmVyYXRlZCBmaWxlOyBkbyBub3QgZWRpdC4NCi0jVGh1IE1heSAxNSAxNzozNzo1MCBFRFQgMjAwOA0KLWx1Y2VuZT0xLjkuMS52MjAwODAzMDYxODExDQotYW5hbHl6ZXI9b3JnLmVjbGlwc2UuaGVscC5iYXNlXCMzLjMuMTAwLnYyMDA4MDQyNT9sb2NhbGVcPWVuDQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kb2NzIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kb2NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWMyYzI5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfZG9jcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotI1RoaXMgaXMgYSBnZW5lcmF0ZWQgZmlsZTsgZG8gbm90IGVkaXQuDQotI1RodSBNYXkgMTUgMTc6Mzc6NTAgRURUIDIwMDgNCi0vb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL3RvcGljcy90YXhpczJ0ZC5odG1sPTANCi0vb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL3RvcGljcy90YXhpczJjbGllbnQuaHRtbD0wDQotL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci90b3BpY3MvY2F4aXMydG92ZXIuaHRtbD0wDQotL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci90b3BpY3MvdGF4aXMyYnUuaHRtbD0wDQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvaW5kZXgvc2VnbWVudHMgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci9pbmRleC9zZWdtZW50cwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZkOWE1MC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci9pbmRleC9zZWdtZW50cworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL215cGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL215cGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI4NzUzNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci9teXBsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4gCi08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08cGx1Z2luPgotICAKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI+Ci0JCTx0b2MgZmlsZT0id3NheGlzMmJ1aWxkX3RvYy54bWwiIC8+Ci0gICAgICAgPGluZGV4IHBhdGg9ImluZGV4LyIvPgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuaW5kZXgiPgotICAgICAgPGluZGV4IGZpbGU9Im9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlcmluZGV4LnhtbCIvPgotPC9leHRlbnNpb24+Ci0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC5iYXNlLmx1Y2VuZVNlYXJjaFBhcnRpY2lwYW50cyI+Ci0gICAgICA8YmluZGluZyBwYXJ0aWNpcGFudElkPSJvcmcuZWNsaXBzZS5oZWxwLmJhc2UueGh0bWwiLz4KLSAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyLm1hcGxpc3QgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIubWFwbGlzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMwN2E5Ni4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIubWFwbGlzdAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPG1hcGxpc3QgdmVyc2lvbj0iMy42LjIiPg0KLSAgPG5hdj4NCi0gICAgPG1hcCBmaWxlPSJ3c2F4aXNidWlsZF90b2MuZGl0YW1hcCIvPg0KLSAgPC9uYXY+DQotICA8bGluaz4NCi0gICAgPG1hcCBmaWxlPSJ3c2F4aXNidWlsZF90b2MuZGl0YW1hcCIvPg0KLSAgPC9saW5rPg0KLTwvbWFwbGlzdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXJpbmRleC54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXJpbmRleC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMWNkZTcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyaW5kZXgueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTxpbmRleD4KLSAgPGVudHJ5IGtleXdvcmQ9IkF4aXMyIHJ1bnRpbWUgZW52aXJvbm1lbnQiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJXZWIgc2VydmljZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Im92ZXJ2aWV3Ij4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jYXhpczJ0b3Zlci5odG1sI2F4aXNvdmVydmlldyIgdGl0bGU9IkNyZWF0aW5nIFdlYiBzZXJ2aWNlcyB3aXRoIHRoZSBBcGFjaGUgQXhpczIgcnVudGltZSBlbnZpcm9ubWVudHMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iSmF2YSBiZWFucyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGF4aXMyYnUuaHRtbCN0d3NiZWFuYSIgdGl0bGU9IkNyZWF0aW5nIGEgV2ViIHNlcnZpY2UgZnJvbSBhIEphdmEgYmVhbiB1c2luZyB0aGUgQXBhY2hlIEF4aXMyIHJ1bnRpbWUgZW52aXJvbm1lbnQiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0ic2tlbGV0b24iPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RheGlzMnRkLmh0bWwjdHNrbHdzZGxhIiB0aXRsZT0iQ3JlYXRpbmcgYSBKYXZhIGJlYW4gc2tlbGV0b24gZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgdGhlIEFwYWNoZSBBeGlzMiBydW50aW1lIGVudmlyb25tZW50Ii8+Ci0gICAgICA8L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImNsaWVudHMiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RheGlzMmNsaWVudC5odG1sI3RzYW1wYXBwYSIgdGl0bGU9IkdlbmVyYXRpbmcgYSBKYXZhIGNsaWVudCBwcm94eSBhbmQgYSBzYW1wbGUgYXBwbGljYXRpb24gZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgdGhlIEF4aXMyIHJ1bnRpbWUgZW52aXJvbm1lbnQiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IldlYiBzZXJ2aWNlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkF4aXMyIHJ1bnRpbWUgZW52aXJvbm1lbnQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Im92ZXJ2aWV3Ij4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jYXhpczJ0b3Zlci5odG1sI2F4aXNvdmVydmlldyIgdGl0bGU9IkNyZWF0aW5nIFdlYiBzZXJ2aWNlcyB3aXRoIHRoZSBBcGFjaGUgQXhpczIgcnVudGltZSBlbnZpcm9ubWVudHMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iY3JlYXRpbmcgYSBXZWIgc2VydmljZSI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGF4aXMyYnUuaHRtbCN0d3NiZWFuYSIgdGl0bGU9IkNyZWF0aW5nIGEgV2ViIHNlcnZpY2UgZnJvbSBhIEphdmEgYmVhbiB1c2luZyB0aGUgQXBhY2hlIEF4aXMyIHJ1bnRpbWUgZW52aXJvbm1lbnQiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0ic2tlbGV0b24gV2ViIHNlcnZpY2VzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YXhpczJ0ZC5odG1sI3Rza2x3c2RsYSIgdGl0bGU9IkNyZWF0aW5nIGEgSmF2YSBiZWFuIHNrZWxldG9uIGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIHRoZSBBcGFjaGUgQXhpczIgcnVudGltZSBlbnZpcm9ubWVudCIvPgotICAgICAgPC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJXZWIgc2VydmljZSBjbGllbnRzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YXhpczJjbGllbnQuaHRtbCN0c2FtcGFwcGEiIHRpdGxlPSJHZW5lcmF0aW5nIGEgSmF2YSBjbGllbnQgcHJveHkgYW5kIGEgc2FtcGxlIGFwcGxpY2F0aW9uIGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIHRoZSBBeGlzMiBydW50aW1lIGVudmlyb25tZW50Ii8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci08L2luZGV4PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMzAyZjQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIgCi0jIE5MU19FTkNPRElORz1VVEYtOCAKLQotcGx1Z2luTmFtZSA9IEF4aXMyIFdlYiBzZXJ2aWNlcyBkb2N1bWVudGF0aW9uCi1wbHVnaW5Qcm92aWRlciA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci9wbHVnaW4ueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI4NzUzNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+IAotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPHBsdWdpbj4KLSAgCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPgotCQk8dG9jIGZpbGU9IndzYXhpczJidWlsZF90b2MueG1sIiAvPgotICAgICAgIDxpbmRleCBwYXRoPSJpbmRleC8iLz4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmluZGV4Ij4KLSAgICAgIDxpbmRleCBmaWxlPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXJpbmRleC54bWwiLz4KLTwvZXh0ZW5zaW9uPgotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuYmFzZS5sdWNlbmVTZWFyY2hQYXJ0aWNpcGFudHMiPgotICAgICAgPGJpbmRpbmcgcGFydGljaXBhbnRJZD0ib3JnLmVjbGlwc2UuaGVscC5iYXNlLnhodG1sIi8+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL3RvcGljcy9jYXhpczJ0b3Zlci5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvdG9waWNzL2NheGlzMnRvdmVyLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZmM0YWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvdG9waWNzL2NheGlzMnRvdmVyLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIg0KLSAiY29uY2VwdC5kdGQiPg0KLTxjb25jZXB0IGlkPSJheGlzb3ZlcnZpZXciIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkNyZWF0aW5nIFdlYiBzZXJ2aWNlcyB3aXRoIHRoZSBBcGFjaGUgQXhpczIgcnVudGltZSBlbnZpcm9ubWVudHM8L3RpdGxlPg0KLTxzaG9ydGRlc2M+VGhpcyBydW50aW1lIGVudmlyb25tZW50IGlzIGZvciB1c2VycyB3aG8gcHJlZmVyIHRvIGRldmVsb3AgZm9yDQotdGhlIG9wZW4gQXBhY2hlIEF4aXMgcGxhdGZvcm0uIEJvdGggQXhpczEgYW5kIEF4aXMyIGFyZSBzdXBwb3J0ZWQgYnkgdGhlIFdlYg0KLXNlcnZpY2VzIHRvb2xzLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtIGtleXJlZj0iY2F4aXMydG92ZXJ8MXxBeGlzcnVudGltZWVudmlyb25tZW50V2Vic2VydmljZXNvdmVydmlldyINCi1zdGF0dXM9InVuY2hhbmdlZCI+QXhpczIgcnVudGltZSBlbnZpcm9ubWVudDxpbmRleHRlcm0+V2ViIHNlcnZpY2VzPGluZGV4dGVybT5vdmVydmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0ga2V5cmVmPSJjYXhpczJ0b3ZlcnwyfFdlYnNlcnZpY2VzQXhpc3J1bnRpbWVlbnZpcm9ubWVudCIgc3RhdHVzPSJ1bmNoYW5nZWQiPldlYg0KLXNlcnZpY2VzPGluZGV4dGVybT5BeGlzMiBydW50aW1lIGVudmlyb25tZW50PGluZGV4dGVybT5vdmVydmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08c2VjdGlvbj48dGl0bGU+QXBhY2hlIEF4aXMyIE92ZXJ2aWV3PC90aXRsZT48cD5BeGlzMiBldm9sdmVkIGZyb20gdGhlIEFwYWNoZQ0KLUF4aXMxLnggYXJjaGl0ZWN0dXJlIGFuZCBpcyBtb3JlIGZsZXhpYmxlLCBjb25maWd1cmFibGUsIGFuZCBlZmZpY2llbnQsIHdoaWxlDQotcmV0YWluaW5nIHRoZSBwb3NpdGl2ZSBhc3BlY3RzIG9mIEFwYWNoZSBBeGlzMS54IGFyY2hpdGVjdHVyZS48L3A+PHA+VGhlIFdlYg0KLXNlcnZpY2UgdG9vbHMgcHJvdmlkZWQgd2l0aCB0aGlzIHByb2R1Y3Qgc3VwcG9ydCB0aGUgZm9sbG93aW5nIHNwZWNpZmljYXRpb25zDQotd2hlbiBjcmVhdGluZyBBcGFjaGUgQXhpczIgV2ViIHNlcnZpY2VzIGFuZCBjbGllbnRzOjx1bD4NCi08bGk+U09BUCAxLjEgYW5kIDEuMjwvbGk+DQotPGxpPldTREwgMS4xLCBpbmNsdWRpbmcgYm90aCBTT0FQIGFuZCBIVFRQIGJpbmRpbmdzIDwvbGk+DQotPGxpPkhUVFAgdHJhbnNwb3J0czwvbGk+DQotPC91bD5UaGUgbGV2ZWxzIG9mIEF4aXMyIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgdGhlIHRvb2xzIGlzIDEuMiBhbmQgMS4zLg0KLUF4aXMyIGNhbiBiZSBkZXBsb3llZCB0byBhbnkgc2VydmVyIHRoYXQgc3VwcG9ydHMgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gU2VydmxldCAyLjIgc3BlY2lmaWNhdGlvbiBvciBoaWdoZXIsDQotaW5jbHVkaW5nIDx0bSB0bWNsYXNzPSJpYm0iIHRtb3duZXI9IklCTSBDb3Jwb3JhdGlvbiIgdG10eXBlPSJyZWciIHRyYWRlbWFyaz0iSUJNIj5JQk08L3RtPiA8dG0NCi10bWNsYXNzPSJpYm0iIHRtb3duZXI9IklCTSBDb3Jwb3JhdGlvbiIgdG10eXBlPSJyZWciIHRyYWRlbWFyaz0iV2ViU3BoZXJlIj5XZWJTcGhlcmU8L3RtPiBBcHBsaWNhdGlvbg0KLVNlcnZlciA2LjEsIGFuZCBBcGFjaGUgVG9tY2F0IHNlcnZlci4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gQXhpczIsIHJlZmVyDQotdG8gPHhyZWYgZm9ybWF0PSJodG1sIiBocmVmPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi8iIHNjb3BlPSJleHRlcm5hbCI+aHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczI8L3hyZWY+LiA8L3A+PHA+VGhlDQotc3VwcG9ydCBmb3IgQXBhY2hlIEF4aXMyIGlzIGxpbWl0ZWQgdG8gdmFsaWRhdGlvbiB0aGF0IHRoZSBhcHBsaWNhdGlvbiBpcw0KLWludm9raW5nIHRoZSBBeGlzMiBlbWl0dGVycyBjb3JyZWN0bHkuIFN1cHBvcnQgZm9yIG90aGVyIEF4aXMyIGlzc3VlcyBzaG91bGQNCi1iZSBkaXJlY3RlZCB0byA8eHJlZiBmb3JtYXQ9Imh0bWwiIGhyZWY9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyLyIgc2NvcGU9ImV4dGVybmFsIj5odHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMjwveHJlZj48L3A+PC9zZWN0aW9uPg0KLTxzZWN0aW9uPjx0aXRsZT5JbnN0YWxsaW5nIHRoZSBBcGFjaGUgQXhpczIgcnVudGltZTwvdGl0bGU+PHA+VW5saWtlIGNyZWF0aW5nDQotV2ViIHNlcnZpY2VzIGluIHRoZSBBcGFjaGUgQXhpczEueCBydW50aW1lLCBiZWZvcmUgY3JlYXRpbmcgYSBXZWIgc2VydmljZQ0KLXVzaW5nIEFwYWNoZSBBeGlzMiB5b3UgbXVzdCBkb3dubG9hZCB0aGUgQXhpczIgcnVudGltZSBhbmQgaW5zdGFsbCBpdCB0aGUNCi13b3JrYmVuY2ggdXNpbmcgdGhlIFdlYiBzZXJ2aWNlcyBBeGlzMiBwcmVmZXJlbmNlcyBwYWdlLjxvbD4NCi08bGk+RG93bmxvYWQgQXBhY2hlIEF4aXMyIHYxLjIgb3IgdjEuMyBmcm9tIHRoZSBmb2xsb3dpbmcgc2l0ZTogPHhyZWYgZm9ybWF0PSJodG1sIg0KLWhyZWY9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2Rvd25sb2FkLmNnaSIgc2NvcGU9ImV4dGVybmFsIj5odHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9kb3dubG9hZC5jZ2k8L3hyZWY+LjwvbGk+DQotPGxpPkZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBhcHByb3ByaWF0ZSBBcGFjaGUgQXhpczIgaW5zdGFsbGF0aW9uIGd1aWRlOiA8dWw+DQotPGxpPkFwYWNoZSBBeGlzMiB2MS4yPHhyZWYgZm9ybWF0PSJodG1sIiBocmVmPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi8xXzIvaW5zdGFsbGF0aW9uZ3VpZGUuaHRtbCINCi1zY29wZT0iZXh0ZXJuYWwiPmh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyLzFfMi9pbnN0YWxsYXRpb25ndWlkZS5odG1sPC94cmVmPjwvbGk+DQotPGxpPkFwYWNoZSBBeGlzMiB2MS4zPHhyZWYgZm9ybWF0PSJodG1sIiBocmVmPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi8xXzMvaW5zdGFsbGF0aW9uZ3VpZGUuaHRtbCINCi1zY29wZT0iZXh0ZXJuYWwiPmh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyLzFfMy9pbnN0YWxsYXRpb25ndWlkZS5odG1sPC94cmVmPjwvbGk+DQotPC91bD48L2xpPg0KLTxsaT5PbmNlIHRoZSBBcGFjaGUgQXhpczIgcnVudGltZSBpcyBpbnN0YWxsZWQsIHlvdSBuZWVkIHRvIGFzc29jaWF0ZSBpdCB3aXRoDQotdGhlIHdvcmtiZW5jaC4gSW4gdGhlIHdvcmtiZW5jaCwgb3BlbiA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD4NCi08dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+PHVpY29udHJvbD5XZWIgc2VydmljZXM8L3VpY29udHJvbD48dWljb250cm9sPkF4aXMyDQotUHJlZmVyZW5jZXM8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi4gT24gdGhlIDx1aWNvbnRyb2w+QXhpczIgUnVudGltZTwvdWljb250cm9sPiB0YWIsDQotYnJvd3NlIHRvIHRoZSBsb2NhdGlvbiB3aGVyZSB5b3UgaW5zdGFsbGVkIEFwYWNoZSBBeGlzMi4gQSBtZXNzYWdlIHdpbGwgZGlzcGxheQ0KLWlmIHRoZSBydW50aW1lIGlzIGluc3RhbGxlZCBzdWNjZXNzZnVsbHkuPC9saT4NCi08L29sPjwvcD48L3NlY3Rpb24+DQotPHNlY3Rpb24+PHRpdGxlPkNyZWF0aW5nIHByb2plY3RzIGZvciBBeGlzMiBXZWIgc2VydmljZXM8L3RpdGxlPjxwPlRoZSBXZWINCi1zZXJ2aWNlIHdpemFyZHMgd2lsbCBhdXRvbWF0aWNhbGx5IGFkZCB0aGUgY29ycmVjdCBmYWNldHMgdG8gYSBkeW5hbWljIFdlYg0KLXByb2plY3QuIEhvd2V2ZXIgaWYgeW91IHdhbnQgdG8gbWFudWFsbHkgY3JlYXRlIGEgZHluYW1pYyBXZWIgcHJvamVjdCBlbmFibGVkDQotZm9yIEF4aXMyIFdlYiBzZXJ2aWNlIGRldmVsb3BtZW50IGNvbXBsZXRlIHRoZSBmb2xsb3dpbmc6PG9sPg0KLTxsaT5DcmVhdGUgdGhlIHNlcnZpY2UgV2ViIHByb2plY3QgYnkgY2xpY2tpbmcgPHVpY29udHJvbD5GaWxlID4gTmV3ID4gUHJvamVjdA0KLT4gRHluYW1pYyBXZWIgcHJvamVjdDwvdWljb250cm9sPi4gRW50ZXIgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjogPG9sPg0KLTxsaT5Qcm9qZWN0IE5hbWU6IFR5cGUgYSBwcm9qZWN0IG5hbWU8L2xpPg0KLTxsaT5JZiB5b3UgYXJlIGRlcGxveWluZyB0byBhIFRvbWNhdCBzZXJ2ZXIsIGVuc3VyZSB0aGF0IDx1aWNvbnRyb2w+QWRkIHByb2plY3QNCi10byBhbiBFQVI8L3VpY29udHJvbD4gaXMgbm90IHNlbGVjdGVkLiBJZiB5b3UgZG8gbm90IGNsZWFyIHRoaXMgY2hlY2tib3ggeW91DQotd2lsbCBiZSB1bmFibGUgdG8gc2VsZWN0IHRoZSBUb21jYXQgc2VydmVyLiBJZiB5b3UgYXJlIGRlcGxveWluZyB0byA8dG0gdG1jbGFzcz0iaWJtIg0KLXRtb3duZXI9IklCTSBDb3Jwb3JhdGlvbiIgdG10eXBlPSJyZWciIHRyYWRlbWFyaz0iV2ViU3BoZXJlIj5XZWJTcGhlcmU8L3RtPiBBcHBsaWNhdGlvbg0KLXNlcnZlciB5b3Ugd2lsbCBuZWVkIHRvIGFkZCB0aGUgcHJvamVjdCB0byBhbiBFQVIuPC9saT4NCi08bGk+VGFyZ2V0IHJ1bnRpbWU6IFNlbGVjdCB0aGUgdmVyc2lvbiBvZiB0aGUgc2VydmVyIHRvIHdoaWNoIHlvdSB3aWxsIGRlcGxveQ0KLXlvdXIgV2ViIHNlcnZpY2UuIElmIGl0IGlzIG5vdCBsaXN0ZWQsIGNsaWNrIDx1aWNvbnRyb2w+TmV3PC91aWNvbnRyb2w+IGFuZA0KLWJyb3dzZSB0byB0aGUgbG9jYXRpb24gd2hlcmUgaXQgaXMgaW5zdGFsbGVkLjwvbGk+DQotPGxpPkNvbmZpZ3VyYXRpb25zOiBTZWxlY3QgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmb3IgeW91ciBzZXJ2ZXIgdHlwZS48L2xpPg0KLTxsaT5DbGljayA8dWljb250cm9sPkZpbmlzaDwvdWljb250cm9sPi48L2xpPg0KLTwvb2w+PC9saT4NCi08bGk+QWRkIHRoZSBBeGlzMiBmYWNldC4gUmlnaHQtY2xpY2sgeW91ciBwcm9qZWN0IGFuZCBjbGljayA8bWVudWNhc2NhZGU+DQotPHVpY29udHJvbD5Qcm9wZXJ0aWVzPC91aWNvbnRyb2w+PHVpY29udHJvbD5Qcm9qZWN0IEZhY2V0czwvdWljb250cm9sPjx1aWNvbnRyb2w+TW9kaWZ5DQotcHJvamVjdDwvdWljb250cm9sPjx1aWNvbnRyb2w+QXhpczIgV2ViIFNlcnZpY2VzPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4sDQotYW5kIGNsaWNrIDx1aWNvbnRyb2w+RmluaXNoPC91aWNvbnRyb2w+LjwvbGk+DQotPGxpPklmIHlvdSBoYXZlIGNob3NlbiB0byBkZXBsb3kgdG8gYSBzZXJ2ZXIgaW4gd2hpY2ggdGhlIEF4aXMyIEpBUiBmaWxlcw0KLXdpbGwgcmVzaWRlIG9uIHRoZSBzZXJ2ZXIgKHN1Y2ggYXMgV2ViU3BoZXJlIEFwcGxpY2F0aW9uIFNlcnZlciksIHlvdSBtdXN0DQotY2hhbmdlIHRoZSBjbGFzc2xvYWRpbmcgZm9yIHRoZSBFQVIgZnJvbSBQQVJFTlRfRklSU1QgdG8gUEFSRU5UX0xBU1QuIEV4cGFuZA0KLXRoZSBFQVIgYXNzb2NpYXRlZCB3aXRoIHlvdXIgQXhpczIgcHJvamVjdCwgYW5kIGxhdW5jaCBpdHMgZGVwbG95bWVudCBkZXNjcmlwdG9yLg0KLU9uIHRoZSA8dWljb250cm9sPkRlcGxveW1lbnQ8L3VpY29udHJvbD4gdGFiLCBleHBhbmQgdGhlIDx1aWNvbnRyb2w+QXBwbGljYXRpb248L3VpY29udHJvbD4gc2VjdGlvbi4NCi1DaGFuZ2UgdGhlIDx1aWNvbnRyb2w+Q2xhc3Nsb2FkZXIgbW9kZTwvdWljb250cm9sPiBmaWVsZCB0byBQQVJFTlRfTEFTVCBhbmQNCi1zYXZlIHlvdXIgY2hhbmdlcy48L2xpPg0KLTwvb2w+PC9wPjwvc2VjdGlvbj4NCi08L2NvbmJvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmtsaXN0Pjx0aXRsZT5SZWxhdGVkIENvbmNlcHRzPC90aXRsZT4NCi08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Qud3MuZG9jLnVzZXIvY29uY2VwdHMvY3dzLmRpdGEiIHNjb3BlPSJwZWVyIj4NCi08bGlua3RleHQ+V2ViIHNlcnZpY2VzPC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LndzLmRvYy51c2VyL2NvbmNlcHRzL2N3c2lud3NhLmRpdGEiIHNjb3BlPSJwZWVyIj4NCi08bGlua3RleHQ+VG9vbHMgZm9yIFdlYiBzZXJ2aWNlcyBkZXZlbG9wbWVudDwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC53cy5kb2MudXNlci9jb25jZXB0cy9jamF4cnBjLmRpdGEiIHNjb3BlPSJwZWVyIj4NCi08bGlua3RleHQ+SkFYLVJQQzwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua2xpc3Q+DQotPGxpbmtsaXN0Pjx0aXRsZT5SZWxhdGVkIFRhc2tzPC90aXRsZT4NCi08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Qud3MuZG9jLnVzZXIvdGFza3MvdG92ZXJ3cy5kaXRhIiBzY29wZT0icGVlciI+DQotPGxpbmt0ZXh0PiBEZXZlbG9waW5nIFdlYiBzZXJ2aWNlczwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua2xpc3Q+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci90b3BpY3MvY2F4aXMydG92ZXIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL3RvcGljcy9jYXhpczJ0b3Zlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTU5ZjIxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL3RvcGljcy9jYXhpczJ0b3Zlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIFdlYiBzZXJ2aWNlcyB3aXRoIHRoZSBBcGFjaGUgQXhpczIgcnVudGltZSBlbnZpcm9ubWVudHMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhpcyBydW50aW1lIGVudmlyb25tZW50IGlzIGZvciB1c2VycyB3aG8gcHJlZmVyIHRvIGRldmVsb3AgZm9yIHRoZSBvcGVuIEFwYWNoZSBBeGlzIHBsYXRmb3JtLiBCb3RoIEF4aXMxIGFuZCBBeGlzMiBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBXZWIgc2VydmljZXMgdG9vbHMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoaXMgcnVudGltZSBlbnZpcm9ubWVudCBpcyBmb3IgdXNlcnMgd2hvIHByZWZlciB0byBkZXZlbG9wIGZvciB0aGUgb3BlbiBBcGFjaGUgQXhpcyBwbGF0Zm9ybS4gQm90aCBBeGlzMSBhbmQgQXhpczIgYXJlIHN1cHBvcnRlZCBieSB0aGUgV2ViIHNlcnZpY2VzIHRvb2xzLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IkF4aXMyIHJ1bnRpbWUgZW52aXJvbm1lbnQsIFdlYiBzZXJ2aWNlcywgb3ZlcnZpZXcsIFdlYiBzZXJ2aWNlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IkF4aXMyIHJ1bnRpbWUgZW52aXJvbm1lbnQsIFdlYiBzZXJ2aWNlcywgb3ZlcnZpZXcsIFdlYiBzZXJ2aWNlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YXhpczJidS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGF4aXMydGQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RheGlzMmNsaWVudC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Qud3MuZG9jLnVzZXIvY29uY2VwdHMvY3dzLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC53cy5kb2MudXNlci9jb25jZXB0cy9jd3NpbndzYS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Qud3MuZG9jLnVzZXIvY29uY2VwdHMvY2pheHJwYy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Qud3MuZG9jLnVzZXIvdGFza3MvdG92ZXJ3cy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImF4aXNvdmVydmlldyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkNyZWF0aW5nIFdlYiBzZXJ2aWNlcyB3aXRoIHRoZSBBcGFjaGUgQXhpczIgcnVudGltZSBlbnZpcm9ubWVudHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImF4aXNvdmVydmlldyI+PGEgbmFtZT0iYXhpc292ZXJ2aWV3Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGluZyBXZWIgc2VydmljZXMgd2l0aCB0aGUgQXBhY2hlIEF4aXMyIHJ1bnRpbWUgZW52aXJvbm1lbnRzPC9oMT4KLQotCi0KLTxkaXY+PHA+VGhpcyBydW50aW1lIGVudmlyb25tZW50IGlzIGZvciB1c2VycyB3aG8gcHJlZmVyIHRvIGRldmVsb3AgZm9yCi10aGUgb3BlbiBBcGFjaGUgQXhpcyBwbGF0Zm9ybS4gQm90aCBBeGlzMSBhbmQgQXhpczIgYXJlIHN1cHBvcnRlZCBieSB0aGUgV2ViCi1zZXJ2aWNlcyB0b29scy48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5BcGFjaGUgQXhpczIgT3ZlcnZpZXc8L2g0PjxwPkF4aXMyIGV2b2x2ZWQgZnJvbSB0aGUgQXBhY2hlCi1BeGlzMS54IGFyY2hpdGVjdHVyZSBhbmQgaXMgbW9yZSBmbGV4aWJsZSwgY29uZmlndXJhYmxlLCBhbmQgZWZmaWNpZW50LCB3aGlsZQotcmV0YWluaW5nIHRoZSBwb3NpdGl2ZSBhc3BlY3RzIG9mIEFwYWNoZSBBeGlzMS54IGFyY2hpdGVjdHVyZS48L3A+Ci08ZGl2IGNsYXNzPSJwIj5UaGUgV2ViCi1zZXJ2aWNlIHRvb2xzIHByb3ZpZGVkIHdpdGggdGhpcyBwcm9kdWN0IHN1cHBvcnQgdGhlIGZvbGxvd2luZyBzcGVjaWZpY2F0aW9ucwotd2hlbiBjcmVhdGluZyBBcGFjaGUgQXhpczIgV2ViIHNlcnZpY2VzIGFuZCBjbGllbnRzOjx1bD4KLTxsaT5TT0FQIDEuMSBhbmQgMS4yPC9saT4KLQotPGxpPldTREwgMS4xLCBpbmNsdWRpbmcgYm90aCBTT0FQIGFuZCBIVFRQIGJpbmRpbmdzIDwvbGk+Ci0KLTxsaT5IVFRQIHRyYW5zcG9ydHM8L2xpPgotCi08L3VsPgotVGhlIGxldmVscyBvZiBBeGlzMiBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IHRoZSB0b29scyBpcyAxLjIgYW5kIDEuMy4KLUF4aXMyIGNhbiBiZSBkZXBsb3llZCB0byBhbnkgc2VydmVyIHRoYXQgc3VwcG9ydHMgSmF2YeKEoiBTZXJ2bGV0IDIuMiBzcGVjaWZpY2F0aW9uIG9yIGhpZ2hlciwKLWluY2x1ZGluZyBJQk08c3VwPsKuPC9zdXA+IFdlYlNwaGVyZTxzdXA+wq48L3N1cD4gQXBwbGljYXRpb24KLVNlcnZlciA2LjEsIGFuZCBBcGFjaGUgVG9tY2F0IHNlcnZlci4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gQXhpczIsIHJlZmVyCi10byA8YSBocmVmPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi8iIHRhcmdldD0iX2JsYW5rIj5odHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMjwvYT4uIDwvZGl2PgotPHA+VGhlCi1zdXBwb3J0IGZvciBBcGFjaGUgQXhpczIgaXMgbGltaXRlZCB0byB2YWxpZGF0aW9uIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGlzCi1pbnZva2luZyB0aGUgQXhpczIgZW1pdHRlcnMgY29ycmVjdGx5LiBTdXBwb3J0IGZvciBvdGhlciBBeGlzMiBpc3N1ZXMgc2hvdWxkCi1iZSBkaXJlY3RlZCB0byA8YSBocmVmPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi8iIHRhcmdldD0iX2JsYW5rIj5odHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMjwvYT48L3A+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPkluc3RhbGxpbmcgdGhlIEFwYWNoZSBBeGlzMiBydW50aW1lPC9oND48ZGl2IGNsYXNzPSJwIj5Vbmxpa2UgY3JlYXRpbmcKLVdlYiBzZXJ2aWNlcyBpbiB0aGUgQXBhY2hlIEF4aXMxLnggcnVudGltZSwgYmVmb3JlIGNyZWF0aW5nIGEgV2ViIHNlcnZpY2UKLXVzaW5nIEFwYWNoZSBBeGlzMiB5b3UgbXVzdCBkb3dubG9hZCB0aGUgQXhpczIgcnVudGltZSBhbmQgaW5zdGFsbCBpdCB0aGUKLXdvcmtiZW5jaCB1c2luZyB0aGUgV2ViIHNlcnZpY2VzIEF4aXMyIHByZWZlcmVuY2VzIHBhZ2UuPG9sPgotPGxpPkRvd25sb2FkIEFwYWNoZSBBeGlzMiB2MS4yIG9yIHYxLjMgZnJvbSB0aGUgZm9sbG93aW5nIHNpdGU6IDxhIGhyZWY9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2Rvd25sb2FkLmNnaSIgdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2Rvd25sb2FkLmNnaTwvYT4uPC9saT4KLQotPGxpPkZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBhcHByb3ByaWF0ZSBBcGFjaGUgQXhpczIgaW5zdGFsbGF0aW9uIGd1aWRlOiA8dWw+Ci08bGk+QXBhY2hlIEF4aXMyIHYxLjI8YSBocmVmPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi8xXzIvaW5zdGFsbGF0aW9uZ3VpZGUuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyLzFfMi9pbnN0YWxsYXRpb25ndWlkZS5odG1sPC9hPjwvbGk+Ci0KLTxsaT5BcGFjaGUgQXhpczIgdjEuMzxhIGhyZWY9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyLzFfMy9pbnN0YWxsYXRpb25ndWlkZS5odG1sIiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvMV8zL2luc3RhbGxhdGlvbmd1aWRlLmh0bWw8L2E+PC9saT4KLQotPC91bD4KLTwvbGk+Ci0KLTxsaT5PbmNlIHRoZSBBcGFjaGUgQXhpczIgcnVudGltZSBpcyBpbnN0YWxsZWQsIHlvdSBuZWVkIHRvIGFzc29jaWF0ZSBpdCB3aXRoCi10aGUgd29ya2JlbmNoLiBJbiB0aGUgd29ya2JlbmNoLCBvcGVuIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZmVyZW5jZXM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2ViIHNlcnZpY2VzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkF4aXMyCi1QcmVmZXJlbmNlczwvc3Bhbj48L3NwYW4+LiBPbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QXhpczIgUnVudGltZTwvc3Bhbj4gdGFiLAotYnJvd3NlIHRvIHRoZSBsb2NhdGlvbiB3aGVyZSB5b3UgaW5zdGFsbGVkIEFwYWNoZSBBeGlzMi4gQSBtZXNzYWdlIHdpbGwgZGlzcGxheQotaWYgdGhlIHJ1bnRpbWUgaXMgaW5zdGFsbGVkIHN1Y2Nlc3NmdWxseS48L2xpPgotCi08L29sPgotPC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPkNyZWF0aW5nIHByb2plY3RzIGZvciBBeGlzMiBXZWIgc2VydmljZXM8L2g0PjxkaXYgY2xhc3M9InAiPlRoZSBXZWIKLXNlcnZpY2Ugd2l6YXJkcyB3aWxsIGF1dG9tYXRpY2FsbHkgYWRkIHRoZSBjb3JyZWN0IGZhY2V0cyB0byBhIGR5bmFtaWMgV2ViCi1wcm9qZWN0LiBIb3dldmVyIGlmIHlvdSB3YW50IHRvIG1hbnVhbGx5IGNyZWF0ZSBhIGR5bmFtaWMgV2ViIHByb2plY3QgZW5hYmxlZAotZm9yIEF4aXMyIFdlYiBzZXJ2aWNlIGRldmVsb3BtZW50IGNvbXBsZXRlIHRoZSBmb2xsb3dpbmc6PG9sPgotPGxpPkNyZWF0ZSB0aGUgc2VydmljZSBXZWIgcHJvamVjdCBieSBjbGlja2luZyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWxlICZndDsgTmV3ICZndDsgUHJvamVjdAotJmd0OyBEeW5hbWljIFdlYiBwcm9qZWN0PC9zcGFuPi4gRW50ZXIgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjogPG9sIHR5cGU9ImEiPgotPGxpPlByb2plY3QgTmFtZTogVHlwZSBhIHByb2plY3QgbmFtZTwvbGk+Ci0KLTxsaT5JZiB5b3UgYXJlIGRlcGxveWluZyB0byBhIFRvbWNhdCBzZXJ2ZXIsIGVuc3VyZSB0aGF0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBwcm9qZWN0Ci10byBhbiBFQVI8L3NwYW4+IGlzIG5vdCBzZWxlY3RlZC4gSWYgeW91IGRvIG5vdCBjbGVhciB0aGlzIGNoZWNrYm94IHlvdQotd2lsbCBiZSB1bmFibGUgdG8gc2VsZWN0IHRoZSBUb21jYXQgc2VydmVyLiBJZiB5b3UgYXJlIGRlcGxveWluZyB0byBXZWJTcGhlcmUgQXBwbGljYXRpb24KLXNlcnZlciB5b3Ugd2lsbCBuZWVkIHRvIGFkZCB0aGUgcHJvamVjdCB0byBhbiBFQVIuPC9saT4KLQotPGxpPlRhcmdldCBydW50aW1lOiBTZWxlY3QgdGhlIHZlcnNpb24gb2YgdGhlIHNlcnZlciB0byB3aGljaCB5b3Ugd2lsbCBkZXBsb3kKLXlvdXIgV2ViIHNlcnZpY2UuIElmIGl0IGlzIG5vdCBsaXN0ZWQsIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4gYW5kCi1icm93c2UgdG8gdGhlIGxvY2F0aW9uIHdoZXJlIGl0IGlzIGluc3RhbGxlZC48L2xpPgotCi08bGk+Q29uZmlndXJhdGlvbnM6IFNlbGVjdCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciB5b3VyIHNlcnZlciB0eXBlLjwvbGk+Ci0KLTxsaT5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2g8L3NwYW4+LjwvbGk+Ci0KLTwvb2w+Ci08L2xpPgotCi08bGk+QWRkIHRoZSBBeGlzMiBmYWNldC4gUmlnaHQtY2xpY2sgeW91ciBwcm9qZWN0IGFuZCBjbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPgotPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJvcGVydGllczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9qZWN0IEZhY2V0czwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Nb2RpZnkKLXByb2plY3Q8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QXhpczIgV2ViIFNlcnZpY2VzPC9zcGFuPjwvc3Bhbj4sCi1hbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPi48L2xpPgotCi08bGk+SWYgeW91IGhhdmUgY2hvc2VuIHRvIGRlcGxveSB0byBhIHNlcnZlciBpbiB3aGljaCB0aGUgQXhpczIgSkFSIGZpbGVzCi13aWxsIHJlc2lkZSBvbiB0aGUgc2VydmVyIChzdWNoIGFzIFdlYlNwaGVyZSBBcHBsaWNhdGlvbiBTZXJ2ZXIpLCB5b3UgbXVzdAotY2hhbmdlIHRoZSBjbGFzc2xvYWRpbmcgZm9yIHRoZSBFQVIgZnJvbSBQQVJFTlRfRklSU1QgdG8gUEFSRU5UX0xBU1QuIEV4cGFuZAotdGhlIEVBUiBhc3NvY2lhdGVkIHdpdGggeW91ciBBeGlzMiBwcm9qZWN0LCBhbmQgbGF1bmNoIGl0cyBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi1PbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RGVwbG95bWVudDwvc3Bhbj4gdGFiLCBleHBhbmQgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFwcGxpY2F0aW9uPC9zcGFuPiBzZWN0aW9uLgotQ2hhbmdlIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DbGFzc2xvYWRlciBtb2RlPC9zcGFuPiBmaWVsZCB0byBQQVJFTlRfTEFTVCBhbmQKLXNhdmUgeW91ciBjaGFuZ2VzLjwvbGk+Ci0KLTwvb2w+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj4KLTx1bCBjbGFzcz0idWxsaW5rcyI+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy90YXhpczJidS5odG1sIj5DcmVhdGluZyBhIFdlYiBzZXJ2aWNlIGZyb20gYSBKYXZhIGJlYW4gdXNpbmcgdGhlIEFwYWNoZSBBeGlzMiBydW50aW1lIGVudmlyb25tZW50PC9hPjwvc3Ryb25nPjxiciAvPgotVGhlIFdlYiBTZXJ2aWNlIHdpemFyZCBhc3Npc3RzIHlvdSBpbiBjcmVhdGluZyBhIG5ldyBXZWIgc2VydmljZSwgY29uZmlndXJpbmcgaXQgZm9yIGRlcGxveW1lbnQsIGFuZCBkZXBsb3lpbmcgdGhlIFdlYiBzZXJ2aWNlIHRvIGEgc2VydmVyLiBPbmNlIHlvdXIgV2ViIHNlcnZpY2UgaXMgZGVwbG95ZWQsIHRoZSB3aXphcmQgYXNzaXN0cyB5b3UgaW4gZ2VuZXJhdGluZyB0aGUgY2xpZW50IHByb3h5IGFuZCBzYW1wbGUgYXBwbGljYXRpb24gdG8gdGVzdCB0aGUgV2ViIHNlcnZpY2UuIFdoZW4geW91IGhhdmUgY29tcGxldGVkIHRlc3RpbmcsIHlvdSBjYW4gcHVibGlzaCB5b3VyIFdlYiBzZXJ2aWNlIHRvIGEgVURESSBCdXNpbmVzcyBSZWdpc3RyeSB1c2luZyB0aGUgRXhwb3J0IHdpemFyZC48L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvdGF4aXMydGQuaHRtbCI+Q3JlYXRpbmcgYSBKYXZhIGJlYW4gc2tlbGV0b24gZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgdGhlIEFwYWNoZSBBeGlzMiBydW50aW1lIGVudmlyb25tZW50PC9hPjwvc3Ryb25nPjxiciAvPgotVGhlIFdlYiBzZXJ2aWNlIHdpemFyZCBhc3Npc3RzIHlvdSBpbiBjcmVhdGluZyBhIHNrZWxldG9uIGJlYW4gZnJvbSBhbiBleGlzdGluZyBXU0RMIGRvY3VtZW50LiBUaGUgc2tlbGV0b24gYmVhbiBjb250YWlucyBhIHNldCBvZiBtZXRob2RzIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgb3BlcmF0aW9ucyBkZXNjcmliZWQgaW4gdGhlIFdTREwgZG9jdW1lbnQuIFdoZW4gdGhlIGJlYW4gaXMgY3JlYXRlZCwgZWFjaCBtZXRob2QgaGFzIGEgdHJpdmlhbCBpbXBsZW1lbnRhdGlvbiB0aGF0IHlvdSByZXBsYWNlIGJ5IGVkaXRpbmcgdGhlIGJlYW4uPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL3RheGlzMmNsaWVudC5odG1sIj5HZW5lcmF0aW5nIGEgSmF2YSBjbGllbnQgcHJveHkgYW5kIGEgc2FtcGxlIGFwcGxpY2F0aW9uIGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIHRoZSBBeGlzMiBydW50aW1lIGVudmlyb25tZW50PC9hPjwvc3Ryb25nPjxiciAvPgotVGhlIFdlYiBTZXJ2aWNlIENsaWVudCB3aXphcmQgYXNzaXN0cyB5b3UgaW4gZ2VuZXJhdGluZyBhIEphdmEgYmVhbiBwcm94eSBhbmQgYSBzYW1wbGUgYXBwbGljYXRpb24uIFRoZSBzYW1wbGUgV2ViIGFwcGxpY2F0aW9uIGRlbW9uc3RyYXRlcyBob3cgdG8gY29kZSBhIHByb3h5IGZpbGUuPC9saT4KLTwvdWw+Ci0KLTxkaXYgY2xhc3M9ImxpbmtsaXN0Ij48c3Ryb25nPlJlbGF0ZWQgQ29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLQotPGRpdj48YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Qud3MuZG9jLnVzZXIvY29uY2VwdHMvY3dzLmh0bWwiPldlYiBzZXJ2aWNlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LndzLmRvYy51c2VyL2NvbmNlcHRzL2N3c2lud3NhLmh0bWwiPlRvb2xzIGZvciBXZWIgc2VydmljZXMgZGV2ZWxvcG1lbnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC53cy5kb2MudXNlci9jb25jZXB0cy9jamF4cnBjLmh0bWwiPkpBWC1SUEM8L2E+PC9kaXY+PC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImxpbmtsaXN0Ij48c3Ryb25nPlJlbGF0ZWQgVGFza3M8L3N0cm9uZz48YnIgLz4KLQotPGRpdj48YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Qud3MuZG9jLnVzZXIvdGFza3MvdG92ZXJ3cy5odG1sIj4gRGV2ZWxvcGluZyBXZWIgc2VydmljZXM8L2E+PC9kaXY+PC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL3RvcGljcy90YXhpczJidS5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvdG9waWNzL3RheGlzMmJ1LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhYzI5MGEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvdG9waWNzL3RheGlzMmJ1LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAiLi4vLi4vZHRkL3Rhc2suZHRkIj4NCi08dGFzayBpZD0idHdzYmVhbmEiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkNyZWF0aW5nIGEgV2ViIHNlcnZpY2UgZnJvbSBhIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGJlYW4gdXNpbmcgdGhlIEFwYWNoZSBBeGlzMiBydW50aW1lDQotZW52aXJvbm1lbnQ8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkNyZWF0aW5nIGEgV2ViIHNlcnZpY2UgZnJvbSBhIEphdmEgYmVhbiB1c2luZyB0aGUgQXBhY2hlIEF4aXMyDQotcnVudGltZSBlbnZpcm9ubWVudDwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5UaGUgV2ViIFNlcnZpY2Ugd2l6YXJkIGFzc2lzdHMgeW91IGluIGNyZWF0aW5nIGEgbmV3IFdlYiBzZXJ2aWNlLA0KLWNvbmZpZ3VyaW5nIGl0IGZvciBkZXBsb3ltZW50LCBhbmQgZGVwbG95aW5nIHRoZSBXZWIgc2VydmljZSB0byBhIHNlcnZlci4NCi1PbmNlIHlvdXIgV2ViIHNlcnZpY2UgaXMgZGVwbG95ZWQsIHRoZSB3aXphcmQgYXNzaXN0cyB5b3UgaW4gZ2VuZXJhdGluZyB0aGUNCi1jbGllbnQgcHJveHkgYW5kIHNhbXBsZSBhcHBsaWNhdGlvbiB0byB0ZXN0IHRoZSBXZWIgc2VydmljZS4gV2hlbiB5b3UgaGF2ZQ0KLWNvbXBsZXRlZCB0ZXN0aW5nLCB5b3UgY2FuIHB1Ymxpc2ggeW91ciBXZWIgc2VydmljZSB0byBhIFVEREkgQnVzaW5lc3MgUmVnaXN0cnkNCi11c2luZyB0aGUgRXhwb3J0IHdpemFyZC48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5BeGlzMiBydW50aW1lIGVudmlyb25tZW50PGluZGV4dGVybT5XZWIgc2VydmljZXM8aW5kZXh0ZXJtPkphdmENCi1iZWFuczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+V2ViIHNlcnZpY2VzPGluZGV4dGVybT5BeGlzMg0KLXJ1bnRpbWUgZW52aXJvbm1lbnQ8aW5kZXh0ZXJtPmNyZWF0aW5nIGEgV2ViIHNlcnZpY2U8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxwcmVyZXE+PHA+UHJlcmVxdWlzaXRlczo8b2w+DQotPGxpIGlkPSJpbnN0YWxsYXhpczJsaW5rIj5Zb3UgbXVzdCBoYXZlIGluc3RhbGxlZCB0aGUgQXBhY2hlIEF4aXMyIHJ1bnRpbWUNCi1lbnZpcm9ubWVudCBhcyBkZXNjcmliZWQgaW46IDx4cmVmIGhyZWY9ImNheGlzMnRvdmVyLmRpdGEiIHNjb3BlPSJsb2NhbCI+PC94cmVmPjwvbGk+DQotPGxpIGlkPSJjcmVhdGV0b21jYXRsaW5rIj5JZiB5b3UgYXJlIHVzaW5nIHRoZSBBcGFjaGUgSmFrYXJ0YSBUb21jYXQgc2VydmxldA0KLWNvbnRhaW5lciBhcyB5b3VyIHNlcnZlciwgeW91IG11c3QgaW5zdGFsbCBpdCwgY29uZmlndXJlIGFuIGluc3RhbmNlIG9mIGl0LA0KLWFuZCBjcmVhdGUgYSBXZWIgcHJvamVjdCB0YXJnZXRlZCB0byBpdCBhcyBkZXNjcmliZWQgaW46IDx4cmVmIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLnVpLmRvYy51c2VyL3RvcGljcy90dG9tY2F0c2Vydi5kaXRhIg0KLXNjb3BlPSJwZWVyIj5DcmVhdGluZyBhbiBBcGFjaGUgVG9tY2F0IHNlcnZlciBhbmQgV2ViIHByb2plY3Q8L3hyZWY+PC9saT4NCi08bGk+Q3JlYXRlIG9yIGltcG9ydCBhIGJlYW4gaW50byB0aGUgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gc291cmNlIGZvbGRlciBvZiB0aGUgV2ViIHByb2plY3QuIFRvDQotaW1wb3J0LCBzZWxlY3QgdGhlIDxiPjx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IFJlc291cmNlczogc3JjPC9iPiBmb2xkZXIsIGFuZCBmcm9tDQotdGhlIGZpbGUgbWVudSBzZWxlY3QgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+SW1wb3J0PC91aWNvbnRyb2w+PHVpY29udHJvbD5HZW5lcmFsPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5GaWxlIFN5c3RlbTwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+IGFuZCBicm93c2UgdG8gd2hlcmUgeW91cg0KLXBhY2thZ2UgaXMuPC9saT4NCi08L29sPjwvcD48L3ByZXJlcT4NCi08Y29udGV4dD5UbyBjcmVhdGUgYSBXZWIgc2VydmljZSBmcm9tIGEgYmVhbiB1c2luZyB0aGUgQXBhY2hlIEF4aXMyIHJ1bnRpbWUNCi1lbnZpcm9ubWVudDo8L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+U3dpdGNoIHRvIHRoZSBKYXZhIEVFIHBlcnNwZWN0aXZlICg8dWljb250cm9sPldpbmRvdyA+IE9wZW4gUGVyc3BlY3RpdmUNCi0+IEphdmEgRUU8L3VpY29udHJvbD4pLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcsIHNlbGVjdCB0aGUgYmVhbiB0aGF0IHlvdSBjcmVhdGVkDQotb3IgaW1wb3J0ZWQgaW50byB0aGUgc291cmNlIGZvbGRlciBvZiB5b3VyIFdlYiBwcm9qZWN0LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrICA8dWljb250cm9sPkZpbGUgPiBOZXcgPiBPdGhlcjwvdWljb250cm9sPi48L2NtZD48aW5mbz5TZWxlY3Q8dWljb250cm9sPldlYg0KLVNlcnZpY2VzPC91aWNvbnRyb2w+IGluIG9yZGVyIHRvIGRpc3BsYXkgdGhlIHZhcmlvdXMgV2ViIHNlcnZpY2Ugd2l6YXJkcy4NCi1TZWxlY3QgdGhlICA8dWljb250cm9sPldlYiBTZXJ2aWNlPC91aWNvbnRyb2w+IHdpemFyZC4gQ2xpY2sgIDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi48L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+V2ViIFNlcnZpY2VzIHBhZ2U6IHNlbGVjdCAgPHVpY29udHJvbD5Cb3R0b20gdXAgSmF2YSBiZWFuIFdlYiBzZXJ2aWNlPC91aWNvbnRyb2w+IGFzDQoteW91ciBXZWIgc2VydmljZSB0eXBlLCBhbmQgc2VsZWN0IHRoZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBiZWFuIGZyb20gd2hpY2ggdGhlIHNlcnZpY2Ugd2lsbCBiZQ0KLWNyZWF0ZWQuPC9jbWQ+DQotPHN1YnN0ZXBzIGlkPSJjcmVhdGVzdGVwNHVsIj4NCi08c3Vic3RlcD48Y21kPlNlbGVjdCB0aGUgc3RhZ2VzIG9mIFdlYiBzZXJ2aWNlcyBkZXZlbG9wbWVudCB0aGF0IHlvdSB3YW50DQotdG8gY29tcGxldGUgdXNpbmcgdGhlIHNsaWRlcjo8L2NtZD48aW5mbz48dWw+DQotPGxpPkRldmVsb3A6IHRoaXMgd2lsbCBkZXZlbG9wIHRoZSBXU0RMIGRlZmluaXRpb24gYW5kIGltcGxlbWVudGF0aW9uIG9mIHRoZQ0KLVdlYiBzZXJ2aWNlLiBUaGlzIGluY2x1ZGVzIHN1Y2ggdGFza3MgYXMgY3JlYXRpbmcgdGhlIG1vZHVsZXMgd2hpY2ggd2lsbCBjb250YWluDQotdGhlIGdlbmVyYXRlZCBjb2RlLCBXU0RMIGZpbGVzLCBkZXBsb3ltZW50IGRlc2NyaXB0b3JzLCBhbmQgPHRtIHRtY2xhc3M9InNwZWNpYWwiDQotdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gZmlsZXMNCi13aGVuIGFwcHJvcHJpYXRlLjwvbGk+DQotPGxpPkFzc2VtYmxlOiB0aGlzIGVuc3VyZXMgdGhlIHByb2plY3QgdGhhdCB3aWxsIGhvc3QgdGhlIFdlYiBzZXJ2aWNlIG9yIGNsaWVudA0KLWdldHMgYXNzb2NpYXRlZCB0byBhbiBFQVIgd2hlbiByZXF1aXJlZCBieSB0aGUgdGFyZ2V0IGFwcGxpY2F0aW9uIHNlcnZlci48L2xpPg0KLTxsaT5EZXBsb3k6IHRoaXMgd2lsbCBjcmVhdGUgdGhlIGRlcGxveW1lbnQgY29kZSBmb3IgdGhlIHNlcnZpY2UuPC9saT4NCi08bGk+SW5zdGFsbDogdGhpcyB3aWxsIGluc3RhbGwgYW5kIGNvbmZpZ3VyZSB0aGUgV2ViIG1vZHVsZSBhbmQgRUFScyBvbiB0aGUNCi10YXJnZXQgc2VydmVyLjwvbGk+DQotPGxpPlN0YXJ0OiB0aGlzIHdpbGwgc3RhcnQgdGhlIHNlcnZlciBvbmNlIHRoZSBzZXJ2aWNlIGhhcyBiZWVuIGluc3RhbGxlZA0KLW9uIGl0LiBUaGUgc2VydmVyLWNvbmZpZy53c2RkIGZpbGUgd2lsbCBiZSBnZW5lcmF0ZWQuPC9saT4NCi08bGk+VGVzdDogdGhpcyB3aWxsIHByb3ZpZGUgdmFyaW91cyBvcHRpb25zIGZvciB0ZXN0aW5nIHRoZSBzZXJ2aWNlLCBzdWNoDQotYXMgdXNpbmcgdGhlIFdlYiBTZXJ2aWNlIEV4cGxvcmVyIG9yIHNhbXBsZSBKU1BzLjwvbGk+DQotPC91bD48L2luZm8+PC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+U2VsZWN0IHlvdXIgc2VydmVyOiB0aGUgZGVmYXVsdCBzZXJ2ZXIgaXMgZGlzcGxheWVkLiBJZiB5b3UNCi13YW50IHRvIGRlcGxveSB5b3VyIHNlcnZpY2UgdG8gYSBkaWZmZXJlbnQgc2VydmVyIGNsaWNrIHRoZSBsaW5rIHRvIHNwZWNpZnkNCi1hIGRpZmZlcmVudCBzZXJ2ZXIuPC9jbWQ+PC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+U2VsZWN0IHlvdXIgcnVudGltZTogZW5zdXJlIHRoZSBBcGFjaGUgQXhpczIgcnVudGltZSBpcyBzZWxlY3RlZC48L2NtZD4NCi08L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5TZWxlY3QgdGhlIHNlcnZpY2UgcHJvamVjdDogdGhlIHByb2plY3Qgc2VsZWN0ZWQgaW4geW91ciB3b3Jrc3BhY2UNCi1pcyBkaXNwbGF5ZWQuIFRvIHNlbGVjdCBhIGRpZmZlcmVudCBwcm9qZWN0IGNsaWNrIG9uIHRoZSBwcm9qZWN0IGxpbmsuIElmDQoteW91IGFyZSBkZXBsb3lpbmcgdG8gPHRtIHRtY2xhc3M9ImlibSIgdG1vd25lcj0iSUJNIENvcnBvcmF0aW9uIiB0bXR5cGU9InJlZyINCi10cmFkZW1hcms9IldlYlNwaGVyZSI+V2ViU3BoZXJlPC90bT4gQXBwbGljYXRpb24gU2VydmVyIHlvdSB3aWxsIGFsc28gYmUgYXNrZWQNCi10byBzZWxlY3QgdGhlIEVBUiBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2plY3QuPC9jbWQ+PGluZm8+RW5zdXJlIHRoYXQgdGhlDQotcHJvamVjdCBzZWxlY3RlZCBhcyB0aGUgQ2xpZW50IFdlYiBQcm9qZWN0IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBTZXJ2aWNlIFdlYg0KLVByb2plY3QsIG9yIHRoZSBzZXJ2aWNlIHdpbGwgYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIGNsaWVudCdzIGdlbmVyYXRlZCBhcnRpZmFjdHMuPC9pbmZvPg0KLTwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPklmIHlvdSB3YW50IHRvIGNyZWF0ZSBhIGNsaWVudCwgc2VsZWN0IHRoZSB0eXBlIG9mIHByb3h5IHRvDQotYmUgZ2VuZXJhdGVkIGFuZCByZXBlYXQgdGhlIGFib3ZlIHN0ZXBzIGZvciB0aGUgY2xpZW50LjwvY21kPjwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPlB1Ymxpc2ggdGhlIFdlYiBzZXJ2aWNlOiB0aGlzIHdpbGwgbGF1bmNoIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXINCi10byBwdWJsaXNoIHlvdXIgV2ViIHNlcnZpY2UgdG8gYSBVRERJIHJlZ2lzdHJ5LjwvY21kPjwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPk1vbml0b3IgdGhlIFdlYiBzZXJ2aWNlOiB0aGlzIHdpbGwgc2VuZCB0aGUgV2ViIHNlcnZpY2UgdHJhZmZpYw0KLXRocm91Z2ggdGhlIFRDUC9JUCBNb25pdG9yLCB3aGljaCBhbGxvd3MgeW91IHRvIHdhdGNoIHRoZSBTT0FQIHRyYWZmaWMgZ2VuZXJhdGVkDQotYnkgdGhlIFdlYiBzZXJ2aWNlIGFuZCB0byB0ZXN0IHRoaXMgdHJhZmZpYyBmb3IgV1MtSSBjb21wbGlhbmNlLiBBbHRlcm5hdGVseQ0KLXlvdSBjYW4gbWFudWFsbHkgc2V0IHVwIGEgVENQL0lQIG1vbml0b3IgYXMgZGVzY3JpYmVkIGluIDx4cmVmIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC53c2kudWkuZG9jLnVzZXIvdGFza3MvdG1vbml0b3IuZGl0YSINCi1zY29wZT0icGVlciI+VXNpbmcgdGhlIFRDUC9JUCBNb25pdG9yIHRvIHRlc3QgV2ViIHNlcnZpY2VzPC94cmVmPjwvY21kPjwvc3Vic3RlcD4NCi08L3N1YnN0ZXBzPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkF4aXMyIFdlYiBTZXJ2aWNlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IEJlYW4gQ29uZmlndXJhdGlvbiBwYWdlOiBJZiB5b3UgaGF2ZQ0KLWEgY3VzdG9tIHNlcnZpY2VzLnhtbCBmaWxlIHlvdSBjYW4gcG9pbnQgdG8gaXQgb24gdGhpcyBwYWdlLCBvciB5b3UgY2FuIGhhdmUNCi10aGUgd2l6YXJkIGNyZWF0ZSBhIGRlZmF1bHQgc2VydmljZXMueG1sIGZpbGUgZm9yIHlvdS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5XZWIgU2VydmljZSBUZXN0IHBhZ2U6IElmIHlvdSBzZWxlY3RlZCB0byB0ZXN0IHRoZSBXZWIgc2VydmljZSwNCi1zZWxlY3QgdGhlIHRlc3QgZmFjaWxpdHkgZm9yIHRoZSBnZW5lcmF0ZWQgV2ViIHNlcnZpY2UuPC9jbWQ+PGluZm8+VGhpcyB3aWxsDQotb3BlbiB0aGUgV2ViIHNlcnZpY2UgaW4gdGhlIFdlYiBTZXJ2aWNlcyBFeHBsb3Jlci4gU2VsZWN0IHRoZSBvcGVyYXRpb24geW91DQotd2FudCB0byB0ZXN0LCBlbnRlciB0aGUgcmVxdWlyZWQgaW5mb3JtYXRpb24sIGFuZCBjbGljazx1aWNvbnRyb2w+R288L3VpY29udHJvbD4uDQotVGhlIHJlc3VsdCB3aWxsIGRpc3BsYXkgaW4gdGhlIFN0YXR1cyBwYW5lLiBDbGljayAgPHVpY29udHJvbD5OZXh0PC91aWNvbnRyb2w+LjwvaW5mbz4NCi08L3N0ZXA+DQotPHN0ZXAgaWQ9ImF4aXMyY2xpZW50cGFnZWxpbmsiPjxjbWQ+QXhpczIgQ2xpZW50IFdlYiBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24NCi1wYWdlOiBVc2UgdGhpcyBwYWdlIHRvIHNlbGVjdCB0aGUgZm9sbG93aW5nIG9wdGlvbnM6IDwvY21kPg0KLTxzdWJzdGVwcz4NCi08c3Vic3RlcD48Y21kPlNlcnZpY2UgTmFtZTogYWNjZXB0IHRoZSBkZWZhdWx0LjwvY21kPjwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPlBvcnQgTmFtZTogYWNjZXB0IHRoZSBkZWZhdWx0LjwvY21kPjwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPkRhdGFiaW5kaW5nIE5hbWU6IG9ubHkgdGhlIEF4aXMyIERhdGFiaW5kaW5nIEZyYW1ld29yayAoQURCKQ0KLWlzIHN1cHBvcnRlZCBhdCB0aGlzIHRpbWUuPC9jbWQ+PC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+Q3VzdG9tIHBhY2thZ2UgbmFtZTogWW91IGNhbiBjaGFuZ2UgdGhlIHBhY2thZ2UgbmFtZSBpbiB0aGlzDQotZmllbGQuPC9jbWQ+PC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+Q2xpZW50IG1vZGU6IFlvdSBjYW4gY2hvb3NlIGlmIHRoZSBjbGllbnQgaXMgc3luY2hyb25vdXMsIGFzeW5jaHJvbm91cywNCi1vciBib3RoLjwvY21kPjwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPkdlbmVyYXRlIHRlc3QgY2FzZSB0byB0ZXN0IHRoZSBzZXJ2aWNlOiBJZiB5b3Ugc2VsZWN0IHRoaXMsDQotdGhlIEF4aXMyIGVtaXR0ZXIgd2lsbCBnZW5lcmF0ZSBKVW5pdCB0ZXN0Y2FzZXMgbWF0Y2hpbmcgdGhlIFdTREwgcHJvdmlkZWQNCi10byB0aGUgY2xpZW50LiBUaGVzZSBKVW5pdCB0ZXN0Y2FzZXMgd2lsbCBiZSBnZW5lcmF0ZWQgdG8gYSBuZXdseSBhZGRlZCBzb3VyY2UNCi1kaXJlY3RvcnkgdG8gdGhlIGNsaWVudCBwcm9qZWN0IGNhbGxlZCA8dWljb250cm9sPnRlc3Q8L3VpY29udHJvbD4uIDwvY21kPg0KLTwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPkdlbmVyYXRlIGFsbCB0eXBlcyBmb3IgYWxsIGVsZW1lbnRzIHJlZmVycmVkIGJ5IHNjaGVtYXM8L2NtZD4NCi08L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5OYW1lc3BhY2UgdG8gcGFja2FnZSBtYXBwaW5nOiBVc2UgdGhpcyB0YWJsZSB0byByZXZpZXcgb3IgZWRpdA0KLXRoZSBtYXBwaW5ncyBiZXR3ZWVuIHBhY2thZ2VzIGFuZCBuYW1lc3BhY2VzLjwvY21kPjwvc3Vic3RlcD4NCi08L3N1YnN0ZXBzPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPldlYiBTZXJ2aWNlIENsaWVudCBUZXN0IHBhZ2U6IFVzZSB0aGlzIHBhZ2UgdG8gc2VsZWN0IHRoZSBmb2xsb3dpbmcNCi1vcHRpb25zOiA8L2NtZD4NCi08c3Vic3RlcHM+DQotPHN1YnN0ZXA+PGNtZD5TZWxlY3QgeW91ciB0ZXN0IGZhY2lsaXR5LiBZb3UgY2FuIHRlc3QgdGhlIGdlbmVyYXRlZCBwcm94eQ0KLWluIHRoZSBXZWIgU2VydmljZSBFeHBsb3Jlciwgb3IgdGhlIFVuaXZlcnNhbCBUZXN0IENsaWVudC48L2NtZD48L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5TZWxlY3QgIDx1aWNvbnRyb2w+UnVuIHRlc3Qgb24gc2VydmVyPC91aWNvbnRyb2w+IHRvIHN0YXJ0IHRoZQ0KLXNlcnZlciBmb3IgeW91IGF1dG9tYXRpY2FsbHkuPC9jbWQ+PC9zdWJzdGVwPg0KLTwvc3Vic3RlcHM+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+V2ViIFNlcnZpY2UgUHVibGljYXRpb24gcGFnZTogU2VsZWN0IHdoZXRoZXIgb3Igbm90IHlvdSB3YW50IHRvDQotcHVibGlzaCB0aGlzIFdlYiBzZXJ2aWNlIHRvIGEgVURESSByZWdpc3RyeS4gQ2xpY2sgPHVpY29udHJvbD5GaW5pc2g8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTwvc3RlcHM+DQotPHJlc3VsdCBpZD0iYXhpc3dzY3JlYXRlcmVzdWx0Ij48cD5BZnRlciB0aGUgV2ViIHNlcnZpY2UgaGFzIGJlZW4gY3JlYXRlZCwNCi10aGUgZm9sbG93aW5nIG1heSBvY2N1ciBkZXBlbmRpbmcgb24gdGhlIG9wdGlvbnMgeW91IHNlbGVjdGVkOiA8dWw+DQotPGxpPklmIHlvdSBoYXZlIHNlbGVjdGVkIHRvIHRlc3QgdGhlIFdlYiBzZXJ2aWNlIHVzaW5nIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXIsDQotdGhlIEV4cGxvcmVyIHdpbGwgb3Blbi4gU2VsZWN0IHRoZSBvcGVyYXRpb24geW91IHdhbnQgdG8gdGVzdCwgZW50ZXIgdGhlIHJlcXVpcmVkDQotaW5mb3JtYXRpb24sIGFuZCBjbGljayAgPGI+R288L2I+LiBUaGUgcmVzdWx0IHdpbGwgZGlzcGxheSBpbiB0aGUgU3RhdHVzIHBhbmUuPC9saT4NCi08bGk+SWYgeW91IGhhdmUgc2VsZWN0ZWQgdG8gcHVibGlzaCB0aGUgV2ViIHNlcnZpY2UsIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXINCi1pcyBsYXVuY2hlZCBkaXNwbGF5aW5nIHRoZSBwYWdlIHJlcXVpcmVkIHRvIHB1Ymxpc2ggeW91ciBXZWIgc2VydmljZS4gRm9sbG93DQotdGhlIGluc3RydWN0aW9ucyBpbiAgPHZhcm5hbWU+UHVibGlzaGluZyB0aGUgV2ViIHNlcnZpY2U8L3Zhcm5hbWU+IHRvIGNvbXBsZXRlDQotdGhpcyB0YXNrLjwvbGk+DQotPC91bD48L3A+PC9yZXN1bHQ+DQotPHBvc3RyZXE+PHA+IDx1aWNvbnRyb2w+SW1wb3J0YW50OjwvdWljb250cm9sPiBJZiB5b3VyIG1ldGhvZHMgY29udGFpbiB0eXBlcywNCi1ub3Qgc3VwcG9ydGVkIGJ5IHRoZSBzYW1wbGUsIHN1Y2ggYXMgYXJyYXlzLCBpbmRleGVkIHByb3BlcnRpZXMsIGFuZCBjb2xsZWN0aW9ucywNCi10aGUgbWV0aG9kcyB3aWxsIGJlIG9taXR0ZWQgZnJvbSB0aGUgc2FtcGxlIGFuZCB5b3Ugd2lsbCByZWNlaXZlIGEgd2FybmluZw0KLW1lc3NhZ2UuPC9wPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rbGlzdD48dGl0bGU+UmVsYXRlZCBDb25jZXB0czwvdGl0bGU+DQotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LndzLmRvYy51c2VyL2NvbmNlcHRzL2N3c2lud3NhLmRpdGEiIHNjb3BlPSJwZWVyIj4NCi08bGlua3RleHQ+IFRvb2xzIGZvciBXZWIgc2VydmljZXMgZGV2ZWxvcG1lbnQ8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Qud3MuZG9jLnVzZXIvY29uY2VwdHMvY3dzLmRpdGEiIHNjb3BlPSJwZWVyIj4NCi08bGlua3RleHQ+V2ViIHNlcnZpY2VzIGRldmVsb3BtZW50PC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rbGlzdD4NCi08bGlua2xpc3Q+PHRpdGxlPlJlbGF0ZWQgVGFza3M8L3RpdGxlPg0KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC53cy5kb2MudXNlci90YXNrcy90b3ZlcndzLmRpdGEiIHNjb3BlPSJwZWVyIj4NCi08bGlua3RleHQ+IERldmVsb3BpbmcgV2ViIHNlcnZpY2VzPC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmRvYy51c2VyL3Rhc2tzL3R1ZGRpZXhwLmRpdGEiDQotc2NvcGU9InBlZXIiPjxsaW5rdGV4dD4gVXNpbmcgdGhlIFdlYiBTZXJ2aWNlcyBFeHBsb3JlcjwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua2xpc3Q+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci90b3BpY3MvdGF4aXMyYnUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL3RvcGljcy90YXhpczJidS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGY4YzdiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL3RvcGljcy90YXhpczJidS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIGEgV2ViIHNlcnZpY2UgZnJvbSBhIEphdmEgYmVhbiB1c2luZyB0aGUgQXBhY2hlIEF4aXMyIHJ1bnRpbWUgZW52aXJvbm1lbnQiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhlIFdlYiBTZXJ2aWNlIHdpemFyZCBhc3Npc3RzIHlvdSBpbiBjcmVhdGluZyBhIG5ldyBXZWIgc2VydmljZSwgY29uZmlndXJpbmcgaXQgZm9yIGRlcGxveW1lbnQsIGFuZCBkZXBsb3lpbmcgdGhlIFdlYiBzZXJ2aWNlIHRvIGEgc2VydmVyLiBPbmNlIHlvdXIgV2ViIHNlcnZpY2UgaXMgZGVwbG95ZWQsIHRoZSB3aXphcmQgYXNzaXN0cyB5b3UgaW4gZ2VuZXJhdGluZyB0aGUgY2xpZW50IHByb3h5IGFuZCBzYW1wbGUgYXBwbGljYXRpb24gdG8gdGVzdCB0aGUgV2ViIHNlcnZpY2UuIFdoZW4geW91IGhhdmUgY29tcGxldGVkIHRlc3RpbmcsIHlvdSBjYW4gcHVibGlzaCB5b3VyIFdlYiBzZXJ2aWNlIHRvIGEgVURESSBCdXNpbmVzcyBSZWdpc3RyeSB1c2luZyB0aGUgRXhwb3J0IHdpemFyZC4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhlIFdlYiBTZXJ2aWNlIHdpemFyZCBhc3Npc3RzIHlvdSBpbiBjcmVhdGluZyBhIG5ldyBXZWIgc2VydmljZSwgY29uZmlndXJpbmcgaXQgZm9yIGRlcGxveW1lbnQsIGFuZCBkZXBsb3lpbmcgdGhlIFdlYiBzZXJ2aWNlIHRvIGEgc2VydmVyLiBPbmNlIHlvdXIgV2ViIHNlcnZpY2UgaXMgZGVwbG95ZWQsIHRoZSB3aXphcmQgYXNzaXN0cyB5b3UgaW4gZ2VuZXJhdGluZyB0aGUgY2xpZW50IHByb3h5IGFuZCBzYW1wbGUgYXBwbGljYXRpb24gdG8gdGVzdCB0aGUgV2ViIHNlcnZpY2UuIFdoZW4geW91IGhhdmUgY29tcGxldGVkIHRlc3RpbmcsIHlvdSBjYW4gcHVibGlzaCB5b3VyIFdlYiBzZXJ2aWNlIHRvIGEgVURESSBCdXNpbmVzcyBSZWdpc3RyeSB1c2luZyB0aGUgRXhwb3J0IHdpemFyZC4iIC8+Ci08bWV0YSBjb250ZW50PSJBeGlzMiBydW50aW1lIGVudmlyb25tZW50LCBXZWIgc2VydmljZXMsIEphdmEgYmVhbnMsIEF4aXMyIHJ1bnRpbWUgZW52aXJvbm1lbnQsIGNyZWF0aW5nIGEgV2ViIHNlcnZpY2UiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJBeGlzMiBydW50aW1lIGVudmlyb25tZW50LCBXZWIgc2VydmljZXMsIEphdmEgYmVhbnMsIEF4aXMyIHJ1bnRpbWUgZW52aXJvbm1lbnQsIGNyZWF0aW5nIGEgV2ViIHNlcnZpY2UiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY2F4aXMydG92ZXIuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LndzLmRvYy51c2VyL2NvbmNlcHRzL2N3c2lud3NhLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC53cy5kb2MudXNlci9jb25jZXB0cy9jd3MuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LndzLmRvYy51c2VyL3Rhc2tzL3RvdmVyd3MuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmRvYy51c2VyL3Rhc2tzL3R1ZGRpZXhwLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHdzYmVhbmEiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5DcmVhdGluZyBhIFdlYiBzZXJ2aWNlIGZyb20gYSBKYXZhIGJlYW4gdXNpbmcgdGhlIEFwYWNoZSBBeGlzMgotcnVudGltZSBlbnZpcm9ubWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHdzYmVhbmEiPjxhIG5hbWU9InR3c2JlYW5hIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGluZyBhIFdlYiBzZXJ2aWNlIGZyb20gYSBKYXZhIGJlYW4gdXNpbmcgdGhlIEFwYWNoZSBBeGlzMiBydW50aW1lCi1lbnZpcm9ubWVudDwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+VGhlIFdlYiBTZXJ2aWNlIHdpemFyZCBhc3Npc3RzIHlvdSBpbiBjcmVhdGluZyBhIG5ldyBXZWIgc2VydmljZSwKLWNvbmZpZ3VyaW5nIGl0IGZvciBkZXBsb3ltZW50LCBhbmQgZGVwbG95aW5nIHRoZSBXZWIgc2VydmljZSB0byBhIHNlcnZlci4KLU9uY2UgeW91ciBXZWIgc2VydmljZSBpcyBkZXBsb3llZCwgdGhlIHdpemFyZCBhc3Npc3RzIHlvdSBpbiBnZW5lcmF0aW5nIHRoZQotY2xpZW50IHByb3h5IGFuZCBzYW1wbGUgYXBwbGljYXRpb24gdG8gdGVzdCB0aGUgV2ViIHNlcnZpY2UuIFdoZW4geW91IGhhdmUKLWNvbXBsZXRlZCB0ZXN0aW5nLCB5b3UgY2FuIHB1Ymxpc2ggeW91ciBXZWIgc2VydmljZSB0byBhIFVEREkgQnVzaW5lc3MgUmVnaXN0cnkKLXVzaW5nIHRoZSBFeHBvcnQgd2l6YXJkLjwvcD4KLQotPGRpdiBjbGFzcz0icCI+PGRpdiBjbGFzcz0icCI+UHJlcmVxdWlzaXRlczo8b2w+Ci08bGkgaWQ9InR3c2JlYW5hX19pbnN0YWxsYXhpczJsaW5rIj48YSBuYW1lPSJ0d3NiZWFuYV9faW5zdGFsbGF4aXMybGluayI+PCEtLSAtLT48L2E+WW91IG11c3QgaGF2ZSBpbnN0YWxsZWQgdGhlIEFwYWNoZSBBeGlzMiBydW50aW1lCi1lbnZpcm9ubWVudCBhcyBkZXNjcmliZWQgaW46IDxhIGhyZWY9ImNheGlzMnRvdmVyLmh0bWwiIHRpdGxlPSJUaGlzIHJ1bnRpbWUgZW52aXJvbm1lbnQgaXMgZm9yIHVzZXJzIHdobyBwcmVmZXIgdG8gZGV2ZWxvcCBmb3ImIzEwO3RoZSBvcGVuIEFwYWNoZSBBeGlzIHBsYXRmb3JtLiBCb3RoIEF4aXMxIGFuZCBBeGlzMiBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBXZWImIzEwO3NlcnZpY2VzIHRvb2xzLiI+Q3JlYXRpbmcgV2ViIHNlcnZpY2VzIHdpdGggdGhlIEFwYWNoZSBBeGlzMiBydW50aW1lIGVudmlyb25tZW50czwvYT48L2xpPgotCi08bGkgaWQ9InR3c2JlYW5hX19jcmVhdGV0b21jYXRsaW5rIj48YSBuYW1lPSJ0d3NiZWFuYV9fY3JlYXRldG9tY2F0bGluayI+PCEtLSAtLT48L2E+SWYgeW91IGFyZSB1c2luZyB0aGUgQXBhY2hlIEpha2FydGEgVG9tY2F0IHNlcnZsZXQKLWNvbnRhaW5lciBhcyB5b3VyIHNlcnZlciwgeW91IG11c3QgaW5zdGFsbCBpdCwgY29uZmlndXJlIGFuIGluc3RhbmNlIG9mIGl0LAotYW5kIGNyZWF0ZSBhIFdlYiBwcm9qZWN0IHRhcmdldGVkIHRvIGl0IGFzIGRlc2NyaWJlZCBpbjogPGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LndzLmF4aXMudWkuZG9jLnVzZXIvdG9waWNzL3R0b21jYXRzZXJ2Lmh0bWwiPkNyZWF0aW5nIGFuIEFwYWNoZSBUb21jYXQgc2VydmVyIGFuZCBXZWIgcHJvamVjdDwvYT48L2xpPgotCi08bGk+Q3JlYXRlIG9yIGltcG9ydCBhIGJlYW4gaW50byB0aGUgSmF2YeKEoiBzb3VyY2UgZm9sZGVyIG9mIHRoZSBXZWIgcHJvamVjdC4gVG8KLWltcG9ydCwgc2VsZWN0IHRoZSA8c3Ryb25nPkphdmEgUmVzb3VyY2VzOiBzcmM8L3N0cm9uZz4gZm9sZGVyLCBhbmQgZnJvbQotdGhlIGZpbGUgbWVudSBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5JbXBvcnQ8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+R2VuZXJhbDwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbGUgU3lzdGVtPC9zcGFuPjwvc3Bhbj4gYW5kIGJyb3dzZSB0byB3aGVyZSB5b3VyCi1wYWNrYWdlIGlzLjwvbGk+Ci0KLTwvb2w+Ci08L2Rpdj4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UbyBjcmVhdGUgYSBXZWIgc2VydmljZSBmcm9tIGEgYmVhbiB1c2luZyB0aGUgQXBhY2hlIEF4aXMyIHJ1bnRpbWUKLWVudmlyb25tZW50OjwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlN3aXRjaCB0byB0aGUgSmF2YSBFRSBwZXJzcGVjdGl2ZSAoPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93ICZndDsgT3BlbiBQZXJzcGVjdGl2ZQotJmd0OyBKYXZhIEVFPC9zcGFuPikuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldywgc2VsZWN0IHRoZSBiZWFuIHRoYXQgeW91IGNyZWF0ZWQKLW9yIGltcG9ydGVkIGludG8gdGhlIHNvdXJjZSBmb2xkZXIgb2YgeW91ciBXZWIgcHJvamVjdC48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IE90aGVyPC9zcGFuPi48L3NwYW4+IFNlbGVjdDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldlYgotU2VydmljZXM8L3NwYW4+IGluIG9yZGVyIHRvIGRpc3BsYXkgdGhlIHZhcmlvdXMgV2ViIHNlcnZpY2Ugd2l6YXJkcy4KLVNlbGVjdCB0aGUgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldlYiBTZXJ2aWNlPC9zcGFuPiB3aXphcmQuIENsaWNrICA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXh0PC9zcGFuPi4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+V2ViIFNlcnZpY2VzIHBhZ2U6IHNlbGVjdCAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Qm90dG9tIHVwIEphdmEgYmVhbiBXZWIgc2VydmljZTwvc3Bhbj4gYXMKLXlvdXIgV2ViIHNlcnZpY2UgdHlwZSwgYW5kIHNlbGVjdCB0aGUgSmF2YSBiZWFuIGZyb20gd2hpY2ggdGhlIHNlcnZpY2Ugd2lsbCBiZQotY3JlYXRlZC48L3NwYW4+Ci08YSBuYW1lPSJ0d3NiZWFuYV9fY3JlYXRlc3RlcDR1bCI+PCEtLSAtLT48L2E+PG9sIHR5cGU9ImEiIGlkPSJ0d3NiZWFuYV9fY3JlYXRlc3RlcDR1bCI+Ci08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgc3RhZ2VzIG9mIFdlYiBzZXJ2aWNlcyBkZXZlbG9wbWVudCB0aGF0IHlvdSB3YW50Ci10byBjb21wbGV0ZSB1c2luZyB0aGUgc2xpZGVyOjwvc3Bhbj4gPHVsPgotPGxpPkRldmVsb3A6IHRoaXMgd2lsbCBkZXZlbG9wIHRoZSBXU0RMIGRlZmluaXRpb24gYW5kIGltcGxlbWVudGF0aW9uIG9mIHRoZQotV2ViIHNlcnZpY2UuIFRoaXMgaW5jbHVkZXMgc3VjaCB0YXNrcyBhcyBjcmVhdGluZyB0aGUgbW9kdWxlcyB3aGljaCB3aWxsIGNvbnRhaW4KLXRoZSBnZW5lcmF0ZWQgY29kZSwgV1NETCBmaWxlcywgZGVwbG95bWVudCBkZXNjcmlwdG9ycywgYW5kIEphdmEgZmlsZXMKLXdoZW4gYXBwcm9wcmlhdGUuPC9saT4KLQotPGxpPkFzc2VtYmxlOiB0aGlzIGVuc3VyZXMgdGhlIHByb2plY3QgdGhhdCB3aWxsIGhvc3QgdGhlIFdlYiBzZXJ2aWNlIG9yIGNsaWVudAotZ2V0cyBhc3NvY2lhdGVkIHRvIGFuIEVBUiB3aGVuIHJlcXVpcmVkIGJ5IHRoZSB0YXJnZXQgYXBwbGljYXRpb24gc2VydmVyLjwvbGk+Ci0KLTxsaT5EZXBsb3k6IHRoaXMgd2lsbCBjcmVhdGUgdGhlIGRlcGxveW1lbnQgY29kZSBmb3IgdGhlIHNlcnZpY2UuPC9saT4KLQotPGxpPkluc3RhbGw6IHRoaXMgd2lsbCBpbnN0YWxsIGFuZCBjb25maWd1cmUgdGhlIFdlYiBtb2R1bGUgYW5kIEVBUnMgb24gdGhlCi10YXJnZXQgc2VydmVyLjwvbGk+Ci0KLTxsaT5TdGFydDogdGhpcyB3aWxsIHN0YXJ0IHRoZSBzZXJ2ZXIgb25jZSB0aGUgc2VydmljZSBoYXMgYmVlbiBpbnN0YWxsZWQKLW9uIGl0LiBUaGUgc2VydmVyLWNvbmZpZy53c2RkIGZpbGUgd2lsbCBiZSBnZW5lcmF0ZWQuPC9saT4KLQotPGxpPlRlc3Q6IHRoaXMgd2lsbCBwcm92aWRlIHZhcmlvdXMgb3B0aW9ucyBmb3IgdGVzdGluZyB0aGUgc2VydmljZSwgc3VjaAotYXMgdXNpbmcgdGhlIFdlYiBTZXJ2aWNlIEV4cGxvcmVyIG9yIHNhbXBsZSBKU1BzLjwvbGk+Ci0KLTwvdWw+Ci08L2xpPgotCi08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB5b3VyIHNlcnZlcjogdGhlIGRlZmF1bHQgc2VydmVyIGlzIGRpc3BsYXllZC4gSWYgeW91Ci13YW50IHRvIGRlcGxveSB5b3VyIHNlcnZpY2UgdG8gYSBkaWZmZXJlbnQgc2VydmVyIGNsaWNrIHRoZSBsaW5rIHRvIHNwZWNpZnkKLWEgZGlmZmVyZW50IHNlcnZlci48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdWJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgeW91ciBydW50aW1lOiBlbnN1cmUgdGhlIEFwYWNoZSBBeGlzMiBydW50aW1lIGlzIHNlbGVjdGVkLjwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3Vic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSBzZXJ2aWNlIHByb2plY3Q6IHRoZSBwcm9qZWN0IHNlbGVjdGVkIGluIHlvdXIgd29ya3NwYWNlCi1pcyBkaXNwbGF5ZWQuIFRvIHNlbGVjdCBhIGRpZmZlcmVudCBwcm9qZWN0IGNsaWNrIG9uIHRoZSBwcm9qZWN0IGxpbmsuIElmCi15b3UgYXJlIGRlcGxveWluZyB0byBXZWJTcGhlcmU8c3VwPsKuPC9zdXA+IEFwcGxpY2F0aW9uIFNlcnZlciB5b3Ugd2lsbCBhbHNvIGJlIGFza2VkCi10byBzZWxlY3QgdGhlIEVBUiBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2plY3QuPC9zcGFuPiBFbnN1cmUgdGhhdCB0aGUKLXByb2plY3Qgc2VsZWN0ZWQgYXMgdGhlIENsaWVudCBXZWIgUHJvamVjdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgU2VydmljZSBXZWIKLVByb2plY3QsIG9yIHRoZSBzZXJ2aWNlIHdpbGwgYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIGNsaWVudCdzIGdlbmVyYXRlZCBhcnRpZmFjdHMuCi08L2xpPgotCi08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPklmIHlvdSB3YW50IHRvIGNyZWF0ZSBhIGNsaWVudCwgc2VsZWN0IHRoZSB0eXBlIG9mIHByb3h5IHRvCi1iZSBnZW5lcmF0ZWQgYW5kIHJlcGVhdCB0aGUgYWJvdmUgc3RlcHMgZm9yIHRoZSBjbGllbnQuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3Vic3RlcGV4cGFuZCI+PHNwYW4+UHVibGlzaCB0aGUgV2ViIHNlcnZpY2U6IHRoaXMgd2lsbCBsYXVuY2ggdGhlIFdlYiBTZXJ2aWNlcyBFeHBsb3JlcgotdG8gcHVibGlzaCB5b3VyIFdlYiBzZXJ2aWNlIHRvIGEgVURESSByZWdpc3RyeS48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdWJzdGVwZXhwYW5kIj48c3Bhbj5Nb25pdG9yIHRoZSBXZWIgc2VydmljZTogdGhpcyB3aWxsIHNlbmQgdGhlIFdlYiBzZXJ2aWNlIHRyYWZmaWMKLXRocm91Z2ggdGhlIFRDUC9JUCBNb25pdG9yLCB3aGljaCBhbGxvd3MgeW91IHRvIHdhdGNoIHRoZSBTT0FQIHRyYWZmaWMgZ2VuZXJhdGVkCi1ieSB0aGUgV2ViIHNlcnZpY2UgYW5kIHRvIHRlc3QgdGhpcyB0cmFmZmljIGZvciBXUy1JIGNvbXBsaWFuY2UuIEFsdGVybmF0ZWx5Ci15b3UgY2FuIG1hbnVhbGx5IHNldCB1cCBhIFRDUC9JUCBtb25pdG9yIGFzIGRlc2NyaWJlZCBpbiA8YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3Qud3NpLnVpLmRvYy51c2VyL3Rhc2tzL3Rtb25pdG9yLmh0bWwiPlVzaW5nIHRoZSBUQ1AvSVAgTW9uaXRvciB0byB0ZXN0IFdlYiBzZXJ2aWNlczwvYT48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5BeGlzMiBXZWIgU2VydmljZSBKYXZhIEJlYW4gQ29uZmlndXJhdGlvbiBwYWdlOiBJZiB5b3UgaGF2ZQotYSBjdXN0b20gc2VydmljZXMueG1sIGZpbGUgeW91IGNhbiBwb2ludCB0byBpdCBvbiB0aGlzIHBhZ2UsIG9yIHlvdSBjYW4gaGF2ZQotdGhlIHdpemFyZCBjcmVhdGUgYSBkZWZhdWx0IHNlcnZpY2VzLnhtbCBmaWxlIGZvciB5b3UuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+V2ViIFNlcnZpY2UgVGVzdCBwYWdlOiBJZiB5b3Ugc2VsZWN0ZWQgdG8gdGVzdCB0aGUgV2ViIHNlcnZpY2UsCi1zZWxlY3QgdGhlIHRlc3QgZmFjaWxpdHkgZm9yIHRoZSBnZW5lcmF0ZWQgV2ViIHNlcnZpY2UuPC9zcGFuPiBUaGlzIHdpbGwKLW9wZW4gdGhlIFdlYiBzZXJ2aWNlIGluIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXIuIFNlbGVjdCB0aGUgb3BlcmF0aW9uIHlvdQotd2FudCB0byB0ZXN0LCBlbnRlciB0aGUgcmVxdWlyZWQgaW5mb3JtYXRpb24sIGFuZCBjbGljazxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkdvPC9zcGFuPi4KLVRoZSByZXN1bHQgd2lsbCBkaXNwbGF5IGluIHRoZSBTdGF0dXMgcGFuZS4gQ2xpY2sgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+LgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIiBpZD0idHdzYmVhbmFfX2F4aXMyY2xpZW50cGFnZWxpbmsiPjxhIG5hbWU9InR3c2JlYW5hX19heGlzMmNsaWVudHBhZ2VsaW5rIj48IS0tIC0tPjwvYT48c3Bhbj5BeGlzMiBDbGllbnQgV2ViIHNlcnZpY2UgY29uZmlndXJhdGlvbgotcGFnZTogVXNlIHRoaXMgcGFnZSB0byBzZWxlY3QgdGhlIGZvbGxvd2luZyBvcHRpb25zOiA8L3NwYW4+Ci08b2wgdHlwZT0iYSI+Ci08bGk+PHNwYW4+U2VydmljZSBOYW1lOiBhY2NlcHQgdGhlIGRlZmF1bHQuPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5Qb3J0IE5hbWU6IGFjY2VwdCB0aGUgZGVmYXVsdC48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkRhdGFiaW5kaW5nIE5hbWU6IG9ubHkgdGhlIEF4aXMyIERhdGFiaW5kaW5nIEZyYW1ld29yayAoQURCKQotaXMgc3VwcG9ydGVkIGF0IHRoaXMgdGltZS48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkN1c3RvbSBwYWNrYWdlIG5hbWU6IFlvdSBjYW4gY2hhbmdlIHRoZSBwYWNrYWdlIG5hbWUgaW4gdGhpcwotZmllbGQuPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5DbGllbnQgbW9kZTogWW91IGNhbiBjaG9vc2UgaWYgdGhlIGNsaWVudCBpcyBzeW5jaHJvbm91cywgYXN5bmNocm9ub3VzLAotb3IgYm90aC48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkdlbmVyYXRlIHRlc3QgY2FzZSB0byB0ZXN0IHRoZSBzZXJ2aWNlOiBJZiB5b3Ugc2VsZWN0IHRoaXMsCi10aGUgQXhpczIgZW1pdHRlciB3aWxsIGdlbmVyYXRlIEpVbml0IHRlc3RjYXNlcyBtYXRjaGluZyB0aGUgV1NETCBwcm92aWRlZAotdG8gdGhlIGNsaWVudC4gVGhlc2UgSlVuaXQgdGVzdGNhc2VzIHdpbGwgYmUgZ2VuZXJhdGVkIHRvIGEgbmV3bHkgYWRkZWQgc291cmNlCi1kaXJlY3RvcnkgdG8gdGhlIGNsaWVudCBwcm9qZWN0IGNhbGxlZCA8c3BhbiBjbGFzcz0idWljb250cm9sIj50ZXN0PC9zcGFuPi4gPC9zcGFuPgotPC9saT4KLQotPGxpPjxzcGFuPkdlbmVyYXRlIGFsbCB0eXBlcyBmb3IgYWxsIGVsZW1lbnRzIHJlZmVycmVkIGJ5IHNjaGVtYXM8L3NwYW4+Ci08L2xpPgotCi08bGk+PHNwYW4+TmFtZXNwYWNlIHRvIHBhY2thZ2UgbWFwcGluZzogVXNlIHRoaXMgdGFibGUgdG8gcmV2aWV3IG9yIGVkaXQKLXRoZSBtYXBwaW5ncyBiZXR3ZWVuIHBhY2thZ2VzIGFuZCBuYW1lc3BhY2VzLjwvc3Bhbj48L2xpPgotCi08L29sPgotCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPldlYiBTZXJ2aWNlIENsaWVudCBUZXN0IHBhZ2U6IFVzZSB0aGlzIHBhZ2UgdG8gc2VsZWN0IHRoZSBmb2xsb3dpbmcKLW9wdGlvbnM6IDwvc3Bhbj4KLTxvbCB0eXBlPSJhIj4KLTxsaT48c3Bhbj5TZWxlY3QgeW91ciB0ZXN0IGZhY2lsaXR5LiBZb3UgY2FuIHRlc3QgdGhlIGdlbmVyYXRlZCBwcm94eQotaW4gdGhlIFdlYiBTZXJ2aWNlIEV4cGxvcmVyLCBvciB0aGUgVW5pdmVyc2FsIFRlc3QgQ2xpZW50Ljwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+U2VsZWN0ICA8c3BhbiBjbGFzcz0idWljb250cm9sIj5SdW4gdGVzdCBvbiBzZXJ2ZXI8L3NwYW4+IHRvIHN0YXJ0IHRoZQotc2VydmVyIGZvciB5b3UgYXV0b21hdGljYWxseS48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5XZWIgU2VydmljZSBQdWJsaWNhdGlvbiBwYWdlOiBTZWxlY3Qgd2hldGhlciBvciBub3QgeW91IHdhbnQgdG8KLXB1Ymxpc2ggdGhpcyBXZWIgc2VydmljZSB0byBhIFVEREkgcmVnaXN0cnkuIENsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiIgaWQ9InR3c2JlYW5hX19heGlzd3NjcmVhdGVyZXN1bHQiPjxhIG5hbWU9InR3c2JlYW5hX19heGlzd3NjcmVhdGVyZXN1bHQiPjwhLS0gLS0+PC9hPjxkaXYgY2xhc3M9InAiPkFmdGVyIHRoZSBXZWIgc2VydmljZSBoYXMgYmVlbiBjcmVhdGVkLAotdGhlIGZvbGxvd2luZyBtYXkgb2NjdXIgZGVwZW5kaW5nIG9uIHRoZSBvcHRpb25zIHlvdSBzZWxlY3RlZDogPHVsPgotPGxpPklmIHlvdSBoYXZlIHNlbGVjdGVkIHRvIHRlc3QgdGhlIFdlYiBzZXJ2aWNlIHVzaW5nIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXIsCi10aGUgRXhwbG9yZXIgd2lsbCBvcGVuLiBTZWxlY3QgdGhlIG9wZXJhdGlvbiB5b3Ugd2FudCB0byB0ZXN0LCBlbnRlciB0aGUgcmVxdWlyZWQKLWluZm9ybWF0aW9uLCBhbmQgY2xpY2sgIDxzdHJvbmc+R288L3N0cm9uZz4uIFRoZSByZXN1bHQgd2lsbCBkaXNwbGF5IGluIHRoZSBTdGF0dXMgcGFuZS48L2xpPgotCi08bGk+SWYgeW91IGhhdmUgc2VsZWN0ZWQgdG8gcHVibGlzaCB0aGUgV2ViIHNlcnZpY2UsIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXIKLWlzIGxhdW5jaGVkIGRpc3BsYXlpbmcgdGhlIHBhZ2UgcmVxdWlyZWQgdG8gcHVibGlzaCB5b3VyIFdlYiBzZXJ2aWNlLiBGb2xsb3cKLXRoZSBpbnN0cnVjdGlvbnMgaW4gIDx2YXIgY2xhc3M9InZhcm5hbWUiPlB1Ymxpc2hpbmcgdGhlIFdlYiBzZXJ2aWNlPC92YXI+IHRvIGNvbXBsZXRlCi10aGlzIHRhc2suPC9saT4KLQotPC91bD4KLTwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5JbXBvcnRhbnQ6PC9zcGFuPiBJZiB5b3VyIG1ldGhvZHMgY29udGFpbiB0eXBlcywKLW5vdCBzdXBwb3J0ZWQgYnkgdGhlIHNhbXBsZSwgc3VjaCBhcyBhcnJheXMsIGluZGV4ZWQgcHJvcGVydGllcywgYW5kIGNvbGxlY3Rpb25zLAotdGhlIG1ldGhvZHMgd2lsbCBiZSBvbWl0dGVkIGZyb20gdGhlIHNhbXBsZSBhbmQgeW91IHdpbGwgcmVjZWl2ZSBhIHdhcm5pbmcKLW1lc3NhZ2UuPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy9jYXhpczJ0b3Zlci5odG1sIiB0aXRsZT0iVGhpcyBydW50aW1lIGVudmlyb25tZW50IGlzIGZvciB1c2VycyB3aG8gcHJlZmVyIHRvIGRldmVsb3AgZm9yIHRoZSBvcGVuIEFwYWNoZSBBeGlzIHBsYXRmb3JtLiBCb3RoIEF4aXMxIGFuZCBBeGlzMiBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBXZWIgc2VydmljZXMgdG9vbHMuIj5DcmVhdGluZyBXZWIgc2VydmljZXMgd2l0aCB0aGUgQXBhY2hlIEF4aXMyIHJ1bnRpbWUgZW52aXJvbm1lbnRzPC9hPjwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImxpbmtsaXN0Ij48c3Ryb25nPlJlbGF0ZWQgQ29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLQotPGRpdj48YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Qud3MuZG9jLnVzZXIvY29uY2VwdHMvY3dzaW53c2EuaHRtbCI+IFRvb2xzIGZvciBXZWIgc2VydmljZXMgZGV2ZWxvcG1lbnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC53cy5kb2MudXNlci9jb25jZXB0cy9jd3MuaHRtbCI+V2ViIHNlcnZpY2VzIGRldmVsb3BtZW50PC9hPjwvZGl2PjwvZGl2PgotCi08ZGl2IGNsYXNzPSJsaW5rbGlzdCI+PHN0cm9uZz5SZWxhdGVkIFRhc2tzPC9zdHJvbmc+PGJyIC8+Ci0KLTxkaXY+PGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LndzLmRvYy51c2VyL3Rhc2tzL3RvdmVyd3MuaHRtbCI+IERldmVsb3BpbmcgV2ViIHNlcnZpY2VzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuZG9jLnVzZXIvdGFza3MvdHVkZGlleHAuaHRtbCI+IFVzaW5nIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXI8L2E+PC9kaXY+PC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL3RvcGljcy90YXhpczJjbGllbnQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL3RvcGljcy90YXhpczJjbGllbnQuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE0MTY0Ni4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci90b3BpY3MvdGF4aXMyY2xpZW50LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0c2FtcGFwcGEiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkdlbmVyYXRpbmcgYSA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBjbGllbnQgcHJveHkgYW5kIGEgc2FtcGxlIGFwcGxpY2F0aW9uDQotZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgdGhlIEF4aXMyIHJ1bnRpbWUgZW52aXJvbm1lbnQ8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkdlbmVyYXRpbmcgYW4gQXBhY2hlIEF4aXMyIEphdmEgY2xpZW50IHByb3h5IGZyb20gYSBXU0RMIGRvY3VtZW50PC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlRoZSBXZWIgU2VydmljZSBDbGllbnQgd2l6YXJkIGFzc2lzdHMgeW91IGluIGdlbmVyYXRpbmcgYSA8dG0gdG1jbGFzcz0ic3BlY2lhbCINCi10bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBiZWFuDQotcHJveHkgYW5kIGEgc2FtcGxlIGFwcGxpY2F0aW9uLiBUaGUgc2FtcGxlIFdlYiBhcHBsaWNhdGlvbiBkZW1vbnN0cmF0ZXMgaG93DQotdG8gY29kZSBhIHByb3h5IGZpbGUuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0ga2V5cmVmPSJ0YXhpczJjbGllbnR8MXxBeGlzMnJ1bnRpbWVlbnZpcm9ubWVudFdlYnNlcnZpY2VjbGllbnRzIg0KLXN0YXR1cz0idW5jaGFuZ2VkIj5BeGlzMiBydW50aW1lIGVudmlyb25tZW50PGluZGV4dGVybT5XZWIgc2VydmljZXM8aW5kZXh0ZXJtPmNsaWVudHM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtIGtleXJlZj0idGF4aXMyY2xpZW50fDJ8V2Vic2VydmljZXNBeGlzMnJ1bnRpbWVlbnZpcm9ubWVudFdlYnNlcnZpY2VjbGllbnRzIg0KLXN0YXR1cz0idW5jaGFuZ2VkIj5XZWIgc2VydmljZXM8aW5kZXh0ZXJtPkF4aXMyIHJ1bnRpbWUgZW52aXJvbm1lbnQ8aW5kZXh0ZXJtPldlYg0KLXNlcnZpY2UgY2xpZW50czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPHByZXJlcT48cD5QcmVyZXF1aXNpdGVzOjwvcD48b2w+DQotPGxpIGNvbnJlZj0idGF4aXMyYnUuZGl0YSN0d3NiZWFuYS9pbnN0YWxsYXhpczJsaW5rIj48L2xpPg0KLTxsaSBjb25yZWY9InRheGlzMmJ1LmRpdGEjdHdzYmVhbmEvY3JlYXRldG9tY2F0bGluayI+PC9saT4NCi08bGk+RGlzY292ZXIgYW5kIGltcG9ydCBhIFdTREwgZG9jdW1lbnQgaW50byB0aGUgV2ViIHByb2plY3QuIFlvdSBjYW4gb25seQ0KLXVzZSBhIFdTREwgZmlsZSB0aGF0IGNvbnRhaW5zIGEgc2VydmljZSBlbGVtZW50LjwvbGk+DQotPC9vbD48L3ByZXJlcT4NCi08Y29udGV4dD5UbyBnZW5lcmF0ZSBhIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGNsaWVudCBwcm94eSBhbmQgYSBzYW1wbGUgYXBwbGljYXRpb24NCi1mcm9tIGEgZGlzY292ZXJlZCBXU0RMIGRvY3VtZW50OjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5Td2l0Y2ggdG8gdGhlIEphdmEgRUUgcGVyc3BlY3RpdmUgKDx1aWNvbnRyb2w+V2luZG93ID4gT3BlbiBQZXJzcGVjdGl2ZQ0KLT4gSmF2YSBFRTwvdWljb250cm9sPikuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIE5hdmlnYXRvciB2aWV3LCBzZWxlY3QgdGhlIFdlYiBwcm9qZWN0IGluIHdoaWNoIHlvdSB3YW50DQotdG8gZ2VuZXJhdGUgYSBzYW1wbGUgYXBwbGljYXRpb24uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgIDx1aWNvbnRyb2w+RmlsZSA+IE5ldyA+IE90aGVyPC91aWNvbnRyb2w+LiBTZWxlY3QgIDx1aWNvbnRyb2w+V2ViDQotU2VydmljZXM8L3VpY29udHJvbD4gaW4gb3JkZXIgdG8gZGlzcGxheSB0aGUgdmFyaW91cyBXZWIgc2VydmljZSB3aXphcmRzLg0KLVNlbGVjdCB0aGUgIDx1aWNvbnRyb2w+V2ViIFNlcnZpY2UgQ2xpZW50PC91aWNvbnRyb2w+IHdpemFyZC4gQ2xpY2sgIDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5XZWIgU2VydmljZXMgcGFnZTogPC9jbWQ+DQotPHN1YnN0ZXBzPg0KLTxzdWJzdGVwPjxjbWQ+RW50ZXIgdGhlIFVSSSB0byB0aGUgV1NETCwgV1NJTCwgb3IgSFRNTCBmaWxlIHRoYXQgd2lsbCBiZSB1c2VkDQotdG8gZ2VuZXJhdGUgdGhlIGNsaWVudC48L2NtZD48L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5TZWxlY3QgdGhlIHR5cGUgb2YgcHJveHkgdG8gYmUgZ2VuZXJhdGVkPC9jbWQ+PC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+U2VsZWN0IHRoZSBzdGFnZXMgb2YgV2ViIHNlcnZpY2VzIGRldmVsb3BtZW50IHRoYXQgeW91IHdhbnQNCi10byBjb21wbGV0ZSB1c2luZyB0aGUgc2xpZGVyOjwvY21kPjxpbmZvPjx1bD4NCi08bGk+RGV2ZWxvcDogdGhpcyB3aWxsIGRldmVsb3AgdGhlIFdTREwgZGVmaW5pdGlvbiBhbmQgaW1wbGVtZW50YXRpb24gb2YgdGhlDQotV2ViIHNlcnZpY2UuIFRoaXMgaW5jbHVkZXMgc3VjaCB0YXNrcyBhcyBjcmVhdGluZyB0aGUgbW9kdWxlcyB3aGljaCB3aWxsIGNvbnRhaW4NCi10aGUgZ2VuZXJhdGVkIGNvZGUgYW5kIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGZpbGVzLCBhcyB3ZWxsIGFzIGNvcHlpbmcgdGhlIEF4aXMNCi1KQVJzLi48L2xpPg0KLTxsaT5Bc3NlbWJsZTogdGhpcyBlbnN1cmVzIHRoZSBwcm9qZWN0IHRoYXQgd2lsbCBob3N0IHRoZSBXZWIgc2VydmljZSBvciBjbGllbnQNCi1nZXRzIGFzc29jaWF0ZWQgdG8gYW4gRUFSIHdoZW4gcmVxdWlyZWQgYnkgdGhlIHRhcmdldCBhcHBsaWNhdGlvbiBzZXJ2ZXIuPC9saT4NCi08bGk+RGVwbG95OiB0aGlzIHdpbGwgY3JlYXRlIHRoZSBkZXBsb3ltZW50IGNvZGUgZm9yIHRoZSBzZXJ2aWNlLjwvbGk+DQotPGxpPkluc3RhbGw6IHRoaXMgd2lsbCBpbnN0YWxsIGFuZCBjb25maWd1cmUgdGhlIFdlYiBtb2R1bGUgYW5kIEVBUnMgb24gdGhlDQotdGFyZ2V0IHNlcnZlci48L2xpPg0KLTxsaT5TdGFydDogdGhpcyB3aWxsIHN0YXJ0IHRoZSBzZXJ2ZXIgb25jZSB0aGUgc2VydmljZSBoYXMgYmVlbiBpbnN0YWxsZWQNCi1vbiBpdC4gVGhlIHNlcnZlci1jb25maWcud3NkZCBmaWxlIHdpbGwgYmUgZ2VuZXJhdGVkLjwvbGk+DQotPGxpPlRlc3Q6IHRoaXMgd2lsbCBwcm92aWRlIHZhcmlvdXMgb3B0aW9ucyBmb3IgdGVzdGluZyB0aGUgc2VydmljZSwgc3VjaA0KLWFzIHVzaW5nIHRoZSBXZWIgU2VydmljZSBFeHBsb3JlciBvciBzYW1wbGUgSlNQcy48L2xpPg0KLTwvdWw+PC9pbmZvPjwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPlNlbGVjdCB5b3VyIHNlcnZlcjogdGhlIGRlZmF1bHQgc2VydmVyIGlzIGRpc3BsYXllZC4gSWYgeW91DQotd2FudCB0byBkZXBsb3kgeW91ciBjbGllbnQgdG8gYSBkaWZmZXJlbnQgc2VydmVyIGNsaWNrIHRoZSBsaW5rIHRvIHNwZWNpZnkNCi1hIGRpZmZlcmVudCBzZXJ2ZXIuPC9jbWQ+PC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+U2VsZWN0IHlvdXIgcnVudGltZTogZW5zdXJlIHRoZSBBcGFjaGUgQXhpczIgcnVudGltZSBpcyBzZWxlY3RlZC48L2NtZD4NCi08L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5TZWxlY3QgdGhlIGNsaWVudCBwcm9qZWN0OiB0aGUgcHJvamVjdCBjb250YWluaW5nIHRoZSBwcm9qZWN0DQotc2VsZWN0ZWQgaW4geW91ciB3b3Jrc3BhY2UgaXMgZGlzcGxheWVkLiBUbyBzZWxlY3QgYSBkaWZmZXJlbnQgcHJvamVjdCBhbmQNCi1FQVIgY2xpY2sgb24gdGhlIHByb2plY3QgbGluay48L2NtZD48aW5mbz5FbnN1cmUgdGhhdCB0aGUgcHJvamVjdCBzZWxlY3RlZA0KLWFzIHRoZSBDbGllbnQgV2ViIFByb2plY3QgaXMgZGlmZmVyZW50IGZyb20gdGhlIFNlcnZpY2UgV2ViIFByb2plY3QsIG9yIHRoZQ0KLXNlcnZpY2Ugd2lsbCBiZSBvdmVyd3JpdHRlbiBieSB0aGUgY2xpZW50J3MgZ2VuZXJhdGVkIGFydGlmYWN0cy48L2luZm8+PC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+TW9uaXRvciB0aGUgV2ViIHNlcnZpY2U6IHRoaXMgd2lsbCBzZW5kIHRoZSBXZWIgc2VydmljZSB0cmFmZmljDQotdGhyb3VnaCB0aGUgVENQL0lQIE1vbml0b3IsIHdoaWNoIGFsbG93cyB5b3UgdG8gd2F0Y2ggdGhlIFNPQVAgdHJhZmZpYyBnZW5lcmF0ZWQNCi1ieSB0aGUgV2ViIHNlcnZpY2UgYW5kIHRvIHRlc3QgdGhpcyB0cmFmZmljIGZvciBXUy1JIGNvbXBsaWFuY2UuIEFsdGVybmF0ZWx5DQoteW91IGNhbiBtYW51YWxseSBzZXQgdXAgYSBUQ1AvSVAgbW9uaXRvciBhcyBkZXNjcmliZWQgaW4gPHhyZWYgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LndzaS51aS5kb2MudXNlci90YXNrcy90bW9uaXRvci5kaXRhIg0KLXNjb3BlPSJwZWVyIj5Vc2luZyB0aGUgVENQL0lQIE1vbml0b3IgdG8gdGVzdCBXZWIgc2VydmljZXM8L3hyZWY+PC9jbWQ+PC9zdWJzdGVwPg0KLTwvc3Vic3RlcHM+DQotPC9zdGVwPg0KLTxzdGVwIGNvbnJlZj0idGF4aXMyYnUuZGl0YSN0d3NiZWFuYS9heGlzMmNsaWVudHBhZ2VsaW5rIj48Y21kPkF4aXMyIENsaWVudA0KLVdlYiBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24gcGFnZTogVXNlIHRoaXMgcGFnZSB0byBzZWxlY3QgdGhlIGZvbGxvd2luZyBvcHRpb25zOiA8L2NtZD4NCi08c3Vic3RlcHM+DQotPHN1YnN0ZXA+PGNtZD5TZXJ2aWNlIE5hbWU6IDwvY21kPjwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPlBvcnQgTmFtZTogPC9jbWQ+PC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+RGF0YWJpbmRpbmcgTmFtZTogT25seSB0aGUgQXhpczIgRGF0YWJpbmRpbmcgRnJhbWV3b3JrIChBREIpDQotaXMgc3VwcG9ydGVkIGF0IHRoaXMgdGltZS48L2NtZD48L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5DdXN0b20gcGFja2FnZSBuYW1lOiBZb3UgY2FuIGNoYW5nZSB0aGUgcGFja2FnZSBuYW1lIGluIHRoaXMNCi1maWVsZC48L2NtZD48L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5DbGllbnQgbW9kZTogWW91IGNhbiBjaG9vc2UgaWYgdGhlIGNsaWVudCBpcyBzeW5jaHJvbm91cywgYXN5bmNocm9ub3VzLA0KLW9yIGJvdGguPC9jbWQ+PC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+R2VuZXJhdGUgdGVzdCBjYXNlIHRvIHRlc3QgdGhlIHNlcnZpY2U6IElmIHlvdSBzZWxlY3QgdGhpcywNCi10aGUgQXhpczIgZW1pdHRlciB3aWxsIGdlbmVyYXRlIEpVbml0IHRlc3RjYXNlcyBtYXRjaGluZyB0aGUgV1NETCBwcm92aWRlZA0KLXRvIHRoZSBjbGllbnQuIFRoZXNlIEpVbml0IHRlc3RjYXNlcyB3aWxsIGJlIGdlbmVyYXRlZCB0byBhIG5ld2x5IGFkZGVkIHNvdXJjZQ0KLWRpcmVjdG9yeSB0byB0aGUgY2xpZW50IHByb2plY3QgY2FsbGVkIDx1aWNvbnRyb2w+dGVzdDwvdWljb250cm9sPi4gPC9jbWQ+DQotPC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+R2VuZXJhdGUgYWxsIHR5cGVzIGZvciBhbGwgZWxlbWVudHMgcmVmZXJyZWQgYnkgc2NoZW1hczo8L2NtZD4NCi08L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5OYW1lc3BhY2UgdG8gcGFja2FnZSBtYXBwaW5nOiBVc2UgdGhpcyB0YWJsZSB0byByZXZpZXcgb3IgZWRpdA0KLXRoZSBtYXBwaW5ncyBiZXR3ZWVuIHBhY2thZ2VzIGFuZCBuYW1lc3BhY2VzLjwvY21kPjwvc3Vic3RlcD4NCi08L3N1YnN0ZXBzPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPldlYiBTZXJ2aWNlIENsaWVudCBUZXN0IHBhZ2U6IFVzZSB0aGlzIHBhZ2UgdG8gc2VsZWN0IHRoZSBmb2xsb3dpbmcNCi1vcHRpb25zOiA8L2NtZD4NCi08c3Vic3RlcHM+DQotPHN1YnN0ZXA+PGNtZD5TZWxlY3QgeW91ciB0ZXN0IGZhY2lsaXR5LiBZb3UgY2FuIHRlc3QgdGhlIGdlbmVyYXRlZCBwcm94eQ0KLWluIHRoZSBXZWIgU2VydmljZSBFeHBsb3Jlciwgb3IgdGhlIFVuaXZlcnNhbCBUZXN0IENsaWVudC48L2NtZD48L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5TZWxlY3QgIDx1aWNvbnRyb2w+UnVuIHRlc3Qgb24gc2VydmVyPC91aWNvbnRyb2w+IHRvIHN0YXJ0IHRoZQ0KLXNlcnZlciBmb3IgeW91IGF1dG9tYXRpY2FsbHkuPC9jbWQ+PC9zdWJzdGVwPg0KLTwvc3Vic3RlcHM+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgIDx1aWNvbnRyb2w+RmluaXNoPC91aWNvbnRyb2w+LiBJZiB5b3UgaGF2ZSBzZWxlY3RlZCB0byB0ZXN0DQotdGhlIHByb3h5LCB0aGUgdGVzdCBjbGllbnQgd2lsbCBvcGVuIGluIGEgYnJvd3NlciB3aW5kb3cuPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHJlc3VsdD48cD5UaGUgZ2VuZXJhdGVkIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGJlYW4gcHJveHkgcHJvdmlkZXMgYSByZW1vdGUgcHJvY2VkdXJlDQotY2FsbCBpbnRlcmZhY2UgdG8gdGhlIFdlYiBzZXJ2aWNlLiBUaGUgc2FtcGxlIFdlYiBhcHBsaWNhdGlvbiBkZW1vbnN0cmF0ZXMNCi1ob3cgdG8gY29kZSB0aGUgcHJveHkgZmlsZS48L3A+PHA+T25jZSB5b3UgaGF2ZSBnZW5lcmF0ZWQgeW91ciA8dG0gdG1jbGFzcz0ic3BlY2lhbCINCi10bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBjbGllbnQNCi1wcm94eSwgeW91IG1heSB0ZXN0IHRoZSBtZXRob2RzIG9mIHRoZSBXZWIgc2VydmljZSB0aHJvdWdoIHRoZSBwcm94eSB1c2luZw0KLVdlYiBTZXJ2aWNlcyBzYW1wbGUgSlNQcyBvciB0aGUgVW5pdmVyc2FsIHRlc3QgY2xpZW50LjwvcD48dWwgb3V0cHV0Y2xhc3M9IndzY2xpZW50dGVzdG9wdGlvbnMiPg0KLTxsaT5JZiB5b3UgaGF2ZSBzZWxlY3RlZCB0byB0ZXN0IHRoZSBnZW5lcmF0ZWQgcHJveHkgdXNpbmcgV2ViIHNlcnZpY2UgSlNQcywNCi10aGUgcHJveHkgaXMgbGF1bmNoZWQgaW4gYSBXZWIgYnJvd3NlciBhdCB0aGUgZm9sbG93aW5nIFVSTDogPGNvZGVwaD5odHRwOi8vbG9jYWxob3N0OiA8dmFybmFtZT5wb3J0PC92YXJuYW1lPi8gPHZhcm5hbWU+V2ViUHJvamVjdDwvdmFybmFtZT5DbGllbnQvc2FtcGxlPGkNCi0+QmVhbk5hbWU8L2k+LyA8dmFybmFtZT5XZWJTZXJ2aWNlTmFtZTwvdmFybmFtZT4vVGVzdENsaWVudC5qc3A8L2NvZGVwaD4gWW91DQotY2FuIHVzZSB0aGlzIHNhbXBsZSBhcHBsaWNhdGlvbiB0byB0ZXN0IHRoZSBXZWIgc2VydmljZSBieSBzZWxlY3RpbmcgYSBtZXRob2QsDQotZW50ZXJpbmcgYSB2YWx1ZSBmb3IgdGhlIG1ldGhvZCwgYW5kIGNsaWNraW5nICA8dWljb250cm9sPkludm9rZTwvdWljb250cm9sPi4NCi1UaGUgcmVzdWx0IG9mIHRoZSBtZXRob2Qgd2lsbCBkaXNwbGF5IGluIHRoZSByZXN1bHRzIHBhbmUuPC9saT4NCi08bGk+SWYgeW91IGhhdmUgc2VsZWN0ZWQgdG8gdGVzdCB0aGUgV2ViIHNlcnZpY2UgdXNpbmcgdGhlIFdlYiBTZXJ2aWNlcyBFeHBsb3JlciwNCi10aGUgRXhwbG9yZXIgd2lsbCBvcGVuLiBTZWxlY3QgdGhlIG9wZXJhdGlvbiB5b3Ugd2FudCB0byB0ZXN0LCBlbnRlciB0aGUgcmVxdWlyZWQNCi1pbmZvcm1hdGlvbiwgYW5kIGNsaWNrICA8Yj5HbzwvYj4uIFRoZSByZXN1bHQgd2lsbCBkaXNwbGF5IGluIHRoZSBTdGF0dXMgcGFuZS48L2xpPg0KLTwvdWw+PHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gb24gY3JlYXRpbmcgYSBXZWIgcHJvamVjdCwgcmVmZXIgdG8gdGhlIFdlYiBhcHBsaWNhdGlvbg0KLWRldmVsb3BtZW50IGRvY3VtZW50YXRpb24uPC9wPjwvcmVzdWx0Pg0KLTwvdGFza2JvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmtsaXN0Pjx0aXRsZT5SZWxhdGVkIENvbmNlcHRzPC90aXRsZT4NCi08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Qud3MuZG9jLnVzZXIvY29uY2VwdHMvY3dzaW53c2EuZGl0YSIgc2NvcGU9InBlZXIiPg0KLTxsaW5rdGV4dD4gVG9vbHMgZm9yIFdlYiBzZXJ2aWNlcyBkZXZlbG9wbWVudDwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC53cy5kb2MudXNlci9jb25jZXB0cy9jd3MuZGl0YSIgc2NvcGU9InBlZXIiPg0KLTxsaW5rdGV4dD5XZWIgc2VydmljZXMgZGV2ZWxvcG1lbnQ8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtsaXN0Pg0KLTxsaW5rbGlzdD48dGl0bGU+UmVsYXRlZCBUYXNrczwvdGl0bGU+DQotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmRvYy51c2VyL3Rhc2tzL3R1ZGRpZXhwLmRpdGEiDQotc2NvcGU9InBlZXIiPjxsaW5rdGV4dD4gVXNpbmcgdGhlIFdlYiBTZXJ2aWNlcyBFeHBsb3JlcjwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua2xpc3Q+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci90b3BpY3MvdGF4aXMyY2xpZW50Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci90b3BpY3MvdGF4aXMyY2xpZW50Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ODg2NDQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvdG9waWNzL3RheGlzMmNsaWVudC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkdlbmVyYXRpbmcgYSBKYXZhIGNsaWVudCBwcm94eSBhbmQgYSBzYW1wbGUgYXBwbGljYXRpb24gZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgdGhlIEF4aXMyIHJ1bnRpbWUgZW52aXJvbm1lbnQiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhlIFdlYiBTZXJ2aWNlIENsaWVudCB3aXphcmQgYXNzaXN0cyB5b3UgaW4gZ2VuZXJhdGluZyBhIEphdmEgYmVhbiBwcm94eSBhbmQgYSBzYW1wbGUgYXBwbGljYXRpb24uIFRoZSBzYW1wbGUgV2ViIGFwcGxpY2F0aW9uIGRlbW9uc3RyYXRlcyBob3cgdG8gY29kZSBhIHByb3h5IGZpbGUuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoZSBXZWIgU2VydmljZSBDbGllbnQgd2l6YXJkIGFzc2lzdHMgeW91IGluIGdlbmVyYXRpbmcgYSBKYXZhIGJlYW4gcHJveHkgYW5kIGEgc2FtcGxlIGFwcGxpY2F0aW9uLiBUaGUgc2FtcGxlIFdlYiBhcHBsaWNhdGlvbiBkZW1vbnN0cmF0ZXMgaG93IHRvIGNvZGUgYSBwcm94eSBmaWxlLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IkF4aXMyIHJ1bnRpbWUgZW52aXJvbm1lbnQsIFdlYiBzZXJ2aWNlcywgY2xpZW50cywgV2ViIHNlcnZpY2UgY2xpZW50cyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IkF4aXMyIHJ1bnRpbWUgZW52aXJvbm1lbnQsIFdlYiBzZXJ2aWNlcywgY2xpZW50cywgV2ViIHNlcnZpY2UgY2xpZW50cyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jYXhpczJ0b3Zlci5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Qud3MuZG9jLnVzZXIvY29uY2VwdHMvY3dzaW53c2EuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LndzLmRvYy51c2VyL2NvbmNlcHRzL2N3cy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuZG9jLnVzZXIvdGFza3MvdHVkZGlleHAuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0c2FtcGFwcGEiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5HZW5lcmF0aW5nIGFuIEFwYWNoZSBBeGlzMiBKYXZhIGNsaWVudCBwcm94eSBmcm9tIGEgV1NETCBkb2N1bWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHNhbXBhcHBhIj48YSBuYW1lPSJ0c2FtcGFwcGEiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkdlbmVyYXRpbmcgYSBKYXZhIGNsaWVudCBwcm94eSBhbmQgYSBzYW1wbGUgYXBwbGljYXRpb24KLWZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIHRoZSBBeGlzMiBydW50aW1lIGVudmlyb25tZW50PC9oMT4KLQotCi0KLQotPGRpdj48cD5UaGUgV2ViIFNlcnZpY2UgQ2xpZW50IHdpemFyZCBhc3Npc3RzIHlvdSBpbiBnZW5lcmF0aW5nIGEgSmF2YeKEoiBiZWFuCi1wcm94eSBhbmQgYSBzYW1wbGUgYXBwbGljYXRpb24uIFRoZSBzYW1wbGUgV2ViIGFwcGxpY2F0aW9uIGRlbW9uc3RyYXRlcyBob3cKLXRvIGNvZGUgYSBwcm94eSBmaWxlLjwvcD4KLQotPGRpdiBjbGFzcz0icCI+PHA+UHJlcmVxdWlzaXRlczo8L3A+Ci08b2w+Ci08bGk+WW91IG11c3QgaGF2ZSBpbnN0YWxsZWQgdGhlIEFwYWNoZSBBeGlzMiBydW50aW1lCi1lbnZpcm9ubWVudCBhcyBkZXNjcmliZWQgaW46IDxhIGhyZWY9ImNheGlzMnRvdmVyLmh0bWwiIHRpdGxlPSJUaGlzIHJ1bnRpbWUgZW52aXJvbm1lbnQgaXMgZm9yIHVzZXJzIHdobyBwcmVmZXIgdG8gZGV2ZWxvcCBmb3ImIzEwO3RoZSBvcGVuIEFwYWNoZSBBeGlzIHBsYXRmb3JtLiBCb3RoIEF4aXMxIGFuZCBBeGlzMiBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBXZWImIzEwO3NlcnZpY2VzIHRvb2xzLiI+Q3JlYXRpbmcgV2ViIHNlcnZpY2VzIHdpdGggdGhlIEFwYWNoZSBBeGlzMiBydW50aW1lIGVudmlyb25tZW50czwvYT48L2xpPgotCi08bGk+SWYgeW91IGFyZSB1c2luZyB0aGUgQXBhY2hlIEpha2FydGEgVG9tY2F0IHNlcnZsZXQKLWNvbnRhaW5lciBhcyB5b3VyIHNlcnZlciwgeW91IG11c3QgaW5zdGFsbCBpdCwgY29uZmlndXJlIGFuIGluc3RhbmNlIG9mIGl0LAotYW5kIGNyZWF0ZSBhIFdlYiBwcm9qZWN0IHRhcmdldGVkIHRvIGl0IGFzIGRlc2NyaWJlZCBpbjogPGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LndzLmF4aXMudWkuZG9jLnVzZXIvdG9waWNzL3R0b21jYXRzZXJ2Lmh0bWwiPkNyZWF0aW5nIGFuIEFwYWNoZSBUb21jYXQgc2VydmVyIGFuZCBXZWIgcHJvamVjdDwvYT48L2xpPgotCi08bGk+RGlzY292ZXIgYW5kIGltcG9ydCBhIFdTREwgZG9jdW1lbnQgaW50byB0aGUgV2ViIHByb2plY3QuIFlvdSBjYW4gb25seQotdXNlIGEgV1NETCBmaWxlIHRoYXQgY29udGFpbnMgYSBzZXJ2aWNlIGVsZW1lbnQuPC9saT4KLQotPC9vbD4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UbyBnZW5lcmF0ZSBhIEphdmEgY2xpZW50IHByb3h5IGFuZCBhIHNhbXBsZSBhcHBsaWNhdGlvbgotZnJvbSBhIGRpc2NvdmVyZWQgV1NETCBkb2N1bWVudDo8L2Rpdj4KLQotPG9sPgotPGxpPjxzcGFuPlN3aXRjaCB0byB0aGUgSmF2YSBFRSBwZXJzcGVjdGl2ZSAoPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93ICZndDsgT3BlbiBQZXJzcGVjdGl2ZQotJmd0OyBKYXZhIEVFPC9zcGFuPikuPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5JbiB0aGUgTmF2aWdhdG9yIHZpZXcsIHNlbGVjdCB0aGUgV2ViIHByb2plY3QgaW4gd2hpY2ggeW91IHdhbnQKLXRvIGdlbmVyYXRlIGEgc2FtcGxlIGFwcGxpY2F0aW9uLjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+Q2xpY2sgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbGUgJmd0OyBOZXcgJmd0OyBPdGhlcjwvc3Bhbj4uIFNlbGVjdCAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2ViCi1TZXJ2aWNlczwvc3Bhbj4gaW4gb3JkZXIgdG8gZGlzcGxheSB0aGUgdmFyaW91cyBXZWIgc2VydmljZSB3aXphcmRzLgotU2VsZWN0IHRoZSAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2ViIFNlcnZpY2UgQ2xpZW50PC9zcGFuPiB3aXphcmQuIENsaWNrICA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXh0PC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08bGk+PHNwYW4+V2ViIFNlcnZpY2VzIHBhZ2U6IDwvc3Bhbj4KLTxvbCB0eXBlPSJhIj4KLTxsaSBjbGFzcz0ic3Vic3RlcGV4cGFuZCI+PHNwYW4+RW50ZXIgdGhlIFVSSSB0byB0aGUgV1NETCwgV1NJTCwgb3IgSFRNTCBmaWxlIHRoYXQgd2lsbCBiZSB1c2VkCi10byBnZW5lcmF0ZSB0aGUgY2xpZW50Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgdHlwZSBvZiBwcm94eSB0byBiZSBnZW5lcmF0ZWQ8L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdWJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgdGhlIHN0YWdlcyBvZiBXZWIgc2VydmljZXMgZGV2ZWxvcG1lbnQgdGhhdCB5b3Ugd2FudAotdG8gY29tcGxldGUgdXNpbmcgdGhlIHNsaWRlcjo8L3NwYW4+IDx1bD4KLTxsaT5EZXZlbG9wOiB0aGlzIHdpbGwgZGV2ZWxvcCB0aGUgV1NETCBkZWZpbml0aW9uIGFuZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKLVdlYiBzZXJ2aWNlLiBUaGlzIGluY2x1ZGVzIHN1Y2ggdGFza3MgYXMgY3JlYXRpbmcgdGhlIG1vZHVsZXMgd2hpY2ggd2lsbCBjb250YWluCi10aGUgZ2VuZXJhdGVkIGNvZGUgYW5kIEphdmEgZmlsZXMsIGFzIHdlbGwgYXMgY29weWluZyB0aGUgQXhpcwotSkFScy4uPC9saT4KLQotPGxpPkFzc2VtYmxlOiB0aGlzIGVuc3VyZXMgdGhlIHByb2plY3QgdGhhdCB3aWxsIGhvc3QgdGhlIFdlYiBzZXJ2aWNlIG9yIGNsaWVudAotZ2V0cyBhc3NvY2lhdGVkIHRvIGFuIEVBUiB3aGVuIHJlcXVpcmVkIGJ5IHRoZSB0YXJnZXQgYXBwbGljYXRpb24gc2VydmVyLjwvbGk+Ci0KLTxsaT5EZXBsb3k6IHRoaXMgd2lsbCBjcmVhdGUgdGhlIGRlcGxveW1lbnQgY29kZSBmb3IgdGhlIHNlcnZpY2UuPC9saT4KLQotPGxpPkluc3RhbGw6IHRoaXMgd2lsbCBpbnN0YWxsIGFuZCBjb25maWd1cmUgdGhlIFdlYiBtb2R1bGUgYW5kIEVBUnMgb24gdGhlCi10YXJnZXQgc2VydmVyLjwvbGk+Ci0KLTxsaT5TdGFydDogdGhpcyB3aWxsIHN0YXJ0IHRoZSBzZXJ2ZXIgb25jZSB0aGUgc2VydmljZSBoYXMgYmVlbiBpbnN0YWxsZWQKLW9uIGl0LiBUaGUgc2VydmVyLWNvbmZpZy53c2RkIGZpbGUgd2lsbCBiZSBnZW5lcmF0ZWQuPC9saT4KLQotPGxpPlRlc3Q6IHRoaXMgd2lsbCBwcm92aWRlIHZhcmlvdXMgb3B0aW9ucyBmb3IgdGVzdGluZyB0aGUgc2VydmljZSwgc3VjaAotYXMgdXNpbmcgdGhlIFdlYiBTZXJ2aWNlIEV4cGxvcmVyIG9yIHNhbXBsZSBKU1BzLjwvbGk+Ci0KLTwvdWw+Ci08L2xpPgotCi08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB5b3VyIHNlcnZlcjogdGhlIGRlZmF1bHQgc2VydmVyIGlzIGRpc3BsYXllZC4gSWYgeW91Ci13YW50IHRvIGRlcGxveSB5b3VyIGNsaWVudCB0byBhIGRpZmZlcmVudCBzZXJ2ZXIgY2xpY2sgdGhlIGxpbmsgdG8gc3BlY2lmeQotYSBkaWZmZXJlbnQgc2VydmVyLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB5b3VyIHJ1bnRpbWU6IGVuc3VyZSB0aGUgQXBhY2hlIEF4aXMyIHJ1bnRpbWUgaXMgc2VsZWN0ZWQuPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdWJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgdGhlIGNsaWVudCBwcm9qZWN0OiB0aGUgcHJvamVjdCBjb250YWluaW5nIHRoZSBwcm9qZWN0Ci1zZWxlY3RlZCBpbiB5b3VyIHdvcmtzcGFjZSBpcyBkaXNwbGF5ZWQuIFRvIHNlbGVjdCBhIGRpZmZlcmVudCBwcm9qZWN0IGFuZAotRUFSIGNsaWNrIG9uIHRoZSBwcm9qZWN0IGxpbmsuPC9zcGFuPiBFbnN1cmUgdGhhdCB0aGUgcHJvamVjdCBzZWxlY3RlZAotYXMgdGhlIENsaWVudCBXZWIgUHJvamVjdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgU2VydmljZSBXZWIgUHJvamVjdCwgb3IgdGhlCi1zZXJ2aWNlIHdpbGwgYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIGNsaWVudCdzIGdlbmVyYXRlZCBhcnRpZmFjdHMuPC9saT4KLQotPGxpIGNsYXNzPSJzdWJzdGVwZXhwYW5kIj48c3Bhbj5Nb25pdG9yIHRoZSBXZWIgc2VydmljZTogdGhpcyB3aWxsIHNlbmQgdGhlIFdlYiBzZXJ2aWNlIHRyYWZmaWMKLXRocm91Z2ggdGhlIFRDUC9JUCBNb25pdG9yLCB3aGljaCBhbGxvd3MgeW91IHRvIHdhdGNoIHRoZSBTT0FQIHRyYWZmaWMgZ2VuZXJhdGVkCi1ieSB0aGUgV2ViIHNlcnZpY2UgYW5kIHRvIHRlc3QgdGhpcyB0cmFmZmljIGZvciBXUy1JIGNvbXBsaWFuY2UuIEFsdGVybmF0ZWx5Ci15b3UgY2FuIG1hbnVhbGx5IHNldCB1cCBhIFRDUC9JUCBtb25pdG9yIGFzIGRlc2NyaWJlZCBpbiA8YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3Qud3NpLnVpLmRvYy51c2VyL3Rhc2tzL3Rtb25pdG9yLmh0bWwiPlVzaW5nIHRoZSBUQ1AvSVAgTW9uaXRvciB0byB0ZXN0IFdlYiBzZXJ2aWNlczwvYT48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPC9saT4KLQotPGxpPjxzcGFuPkF4aXMyIENsaWVudCBXZWIgc2VydmljZSBjb25maWd1cmF0aW9uCi1wYWdlOiBVc2UgdGhpcyBwYWdlIHRvIHNlbGVjdCB0aGUgZm9sbG93aW5nIG9wdGlvbnM6IDwvc3Bhbj4KLTxvbCB0eXBlPSJhIj4KLTxsaT48c3Bhbj5TZXJ2aWNlIE5hbWU6IGFjY2VwdCB0aGUgZGVmYXVsdC48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPlBvcnQgTmFtZTogYWNjZXB0IHRoZSBkZWZhdWx0Ljwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+RGF0YWJpbmRpbmcgTmFtZTogb25seSB0aGUgQXhpczIgRGF0YWJpbmRpbmcgRnJhbWV3b3JrIChBREIpCi1pcyBzdXBwb3J0ZWQgYXQgdGhpcyB0aW1lLjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+Q3VzdG9tIHBhY2thZ2UgbmFtZTogWW91IGNhbiBjaGFuZ2UgdGhlIHBhY2thZ2UgbmFtZSBpbiB0aGlzCi1maWVsZC48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkNsaWVudCBtb2RlOiBZb3UgY2FuIGNob29zZSBpZiB0aGUgY2xpZW50IGlzIHN5bmNocm9ub3VzLCBhc3luY2hyb25vdXMsCi1vciBib3RoLjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+R2VuZXJhdGUgdGVzdCBjYXNlIHRvIHRlc3QgdGhlIHNlcnZpY2U6IElmIHlvdSBzZWxlY3QgdGhpcywKLXRoZSBBeGlzMiBlbWl0dGVyIHdpbGwgZ2VuZXJhdGUgSlVuaXQgdGVzdGNhc2VzIG1hdGNoaW5nIHRoZSBXU0RMIHByb3ZpZGVkCi10byB0aGUgY2xpZW50LiBUaGVzZSBKVW5pdCB0ZXN0Y2FzZXMgd2lsbCBiZSBnZW5lcmF0ZWQgdG8gYSBuZXdseSBhZGRlZCBzb3VyY2UKLWRpcmVjdG9yeSB0byB0aGUgY2xpZW50IHByb2plY3QgY2FsbGVkIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPnRlc3Q8L3NwYW4+LiA8L3NwYW4+Ci08L2xpPgotCi08bGk+PHNwYW4+R2VuZXJhdGUgYWxsIHR5cGVzIGZvciBhbGwgZWxlbWVudHMgcmVmZXJyZWQgYnkgc2NoZW1hczwvc3Bhbj4KLTwvbGk+Ci0KLTxsaT48c3Bhbj5OYW1lc3BhY2UgdG8gcGFja2FnZSBtYXBwaW5nOiBVc2UgdGhpcyB0YWJsZSB0byByZXZpZXcgb3IgZWRpdAotdGhlIG1hcHBpbmdzIGJldHdlZW4gcGFja2FnZXMgYW5kIG5hbWVzcGFjZXMuPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTwvbGk+Ci0KLTxsaT48c3Bhbj5XZWIgU2VydmljZSBDbGllbnQgVGVzdCBwYWdlOiBVc2UgdGhpcyBwYWdlIHRvIHNlbGVjdCB0aGUgZm9sbG93aW5nCi1vcHRpb25zOiA8L3NwYW4+Ci08b2wgdHlwZT0iYSI+Ci08bGk+PHNwYW4+U2VsZWN0IHlvdXIgdGVzdCBmYWNpbGl0eS4gWW91IGNhbiB0ZXN0IHRoZSBnZW5lcmF0ZWQgcHJveHkKLWluIHRoZSBXZWIgU2VydmljZSBFeHBsb3Jlciwgb3IgdGhlIFVuaXZlcnNhbCBUZXN0IENsaWVudC48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPlNlbGVjdCAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UnVuIHRlc3Qgb24gc2VydmVyPC9zcGFuPiB0byBzdGFydCB0aGUKLXNlcnZlciBmb3IgeW91IGF1dG9tYXRpY2FsbHkuPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTwvbGk+Ci0KLTxsaT48c3Bhbj5DbGljayAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPi4gSWYgeW91IGhhdmUgc2VsZWN0ZWQgdG8gdGVzdAotdGhlIHByb3h5LCB0aGUgdGVzdCBjbGllbnQgd2lsbCBvcGVuIGluIGEgYnJvd3NlciB3aW5kb3cuPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBnZW5lcmF0ZWQgSmF2YSBiZWFuIHByb3h5IHByb3ZpZGVzIGEgcmVtb3RlIHByb2NlZHVyZQotY2FsbCBpbnRlcmZhY2UgdG8gdGhlIFdlYiBzZXJ2aWNlLiBUaGUgc2FtcGxlIFdlYiBhcHBsaWNhdGlvbiBkZW1vbnN0cmF0ZXMKLWhvdyB0byBjb2RlIHRoZSBwcm94eSBmaWxlLjwvcD4KLTxwPk9uY2UgeW91IGhhdmUgZ2VuZXJhdGVkIHlvdXIgSmF2YSBjbGllbnQKLXByb3h5LCB5b3UgbWF5IHRlc3QgdGhlIG1ldGhvZHMgb2YgdGhlIFdlYiBzZXJ2aWNlIHRocm91Z2ggdGhlIHByb3h5IHVzaW5nCi1XZWIgU2VydmljZXMgc2FtcGxlIEpTUHMgb3IgdGhlIFVuaXZlcnNhbCB0ZXN0IGNsaWVudC48L3A+Ci08dWwgY2xhc3M9IndzY2xpZW50dGVzdG9wdGlvbnMiPgotPGxpPklmIHlvdSBoYXZlIHNlbGVjdGVkIHRvIHRlc3QgdGhlIGdlbmVyYXRlZCBwcm94eSB1c2luZyBXZWIgc2VydmljZSBKU1BzLAotdGhlIHByb3h5IGlzIGxhdW5jaGVkIGluIGEgV2ViIGJyb3dzZXIgYXQgdGhlIGZvbGxvd2luZyBVUkw6IDxzYW1wIGNsYXNzPSJjb2RlcGgiPmh0dHA6Ly9sb2NhbGhvc3Q6IDx2YXIgY2xhc3M9InZhcm5hbWUiPnBvcnQ8L3Zhcj4vIDx2YXIgY2xhc3M9InZhcm5hbWUiPldlYlByb2plY3Q8L3Zhcj5DbGllbnQvc2FtcGxlPGVtPkJlYW5OYW1lPC9lbT4vIDx2YXIgY2xhc3M9InZhcm5hbWUiPldlYlNlcnZpY2VOYW1lPC92YXI+L1Rlc3RDbGllbnQuanNwPC9zYW1wPiBZb3UKLWNhbiB1c2UgdGhpcyBzYW1wbGUgYXBwbGljYXRpb24gdG8gdGVzdCB0aGUgV2ViIHNlcnZpY2UgYnkgc2VsZWN0aW5nIGEgbWV0aG9kLAotZW50ZXJpbmcgYSB2YWx1ZSBmb3IgdGhlIG1ldGhvZCwgYW5kIGNsaWNraW5nICA8c3BhbiBjbGFzcz0idWljb250cm9sIj5JbnZva2U8L3NwYW4+LgotVGhlIHJlc3VsdCBvZiB0aGUgbWV0aG9kIHdpbGwgZGlzcGxheSBpbiB0aGUgcmVzdWx0cyBwYW5lLjwvbGk+Ci0KLTxsaT5JZiB5b3UgaGF2ZSBzZWxlY3RlZCB0byB0ZXN0IHRoZSBXZWIgc2VydmljZSB1c2luZyB0aGUgV2ViIFNlcnZpY2VzIEV4cGxvcmVyLAotdGhlIEV4cGxvcmVyIHdpbGwgb3Blbi4gU2VsZWN0IHRoZSBvcGVyYXRpb24geW91IHdhbnQgdG8gdGVzdCwgZW50ZXIgdGhlIHJlcXVpcmVkCi1pbmZvcm1hdGlvbiwgYW5kIGNsaWNrICA8c3Ryb25nPkdvPC9zdHJvbmc+LiBUaGUgcmVzdWx0IHdpbGwgZGlzcGxheSBpbiB0aGUgU3RhdHVzIHBhbmUuPC9saT4KLQotPC91bD4KLTxwPkZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGNyZWF0aW5nIGEgV2ViIHByb2plY3QsIHJlZmVyIHRvIHRoZSBXZWIgYXBwbGljYXRpb24KLWRldmVsb3BtZW50IGRvY3VtZW50YXRpb24uPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy9jYXhpczJ0b3Zlci5odG1sIiB0aXRsZT0iVGhpcyBydW50aW1lIGVudmlyb25tZW50IGlzIGZvciB1c2VycyB3aG8gcHJlZmVyIHRvIGRldmVsb3AgZm9yIHRoZSBvcGVuIEFwYWNoZSBBeGlzIHBsYXRmb3JtLiBCb3RoIEF4aXMxIGFuZCBBeGlzMiBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBXZWIgc2VydmljZXMgdG9vbHMuIj5DcmVhdGluZyBXZWIgc2VydmljZXMgd2l0aCB0aGUgQXBhY2hlIEF4aXMyIHJ1bnRpbWUgZW52aXJvbm1lbnRzPC9hPjwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImxpbmtsaXN0Ij48c3Ryb25nPlJlbGF0ZWQgQ29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLQotPGRpdj48YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Qud3MuZG9jLnVzZXIvY29uY2VwdHMvY3dzaW53c2EuaHRtbCI+IFRvb2xzIGZvciBXZWIgc2VydmljZXMgZGV2ZWxvcG1lbnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC53cy5kb2MudXNlci9jb25jZXB0cy9jd3MuaHRtbCI+V2ViIHNlcnZpY2VzIGRldmVsb3BtZW50PC9hPjwvZGl2PjwvZGl2PgotCi08ZGl2IGNsYXNzPSJsaW5rbGlzdCI+PHN0cm9uZz5SZWxhdGVkIFRhc2tzPC9zdHJvbmc+PGJyIC8+Ci0KLTxkaXY+PGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmRvYy51c2VyL3Rhc2tzL3R1ZGRpZXhwLmh0bWwiPiBVc2luZyB0aGUgV2ViIFNlcnZpY2VzIEV4cGxvcmVyPC9hPjwvZGl2PjwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci90b3BpY3MvdGF4aXMydGQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL3RvcGljcy90YXhpczJ0ZC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGMzYTJkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL3RvcGljcy90YXhpczJ0ZC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gIi4uLy4uL2R0ZC90YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRza2x3c2RsYSIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+Q3JlYXRpbmcgYSA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSINCi10cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBiZWFuIHNrZWxldG9uIGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIHRoZSBBcGFjaGUNCi1BeGlzMiBydW50aW1lIGVudmlyb25tZW50PC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5DcmVhdGluZyBhIEphdmEgYmVhbiBza2VsZXRvbiBmcm9tIGEgV1NETCBkb2N1bWVudCB1c2luZyB0aGUNCi1BcGFjaGUgQXhpczIgcnVudGltZSBlbnZpcm9ubWVudDwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5UaGUgV2ViIHNlcnZpY2Ugd2l6YXJkIGFzc2lzdHMgeW91IGluIGNyZWF0aW5nIGEgc2tlbGV0b24gYmVhbg0KLWZyb20gYW4gZXhpc3RpbmcgV1NETCBkb2N1bWVudC4gVGhlIHNrZWxldG9uIGJlYW4gY29udGFpbnMgYSBzZXQgb2YgbWV0aG9kcw0KLXRoYXQgY29ycmVzcG9uZCB0byB0aGUgb3BlcmF0aW9ucyBkZXNjcmliZWQgaW4gdGhlIFdTREwgZG9jdW1lbnQuIFdoZW4gdGhlDQotYmVhbiBpcyBjcmVhdGVkLCBlYWNoIG1ldGhvZCBoYXMgYSB0cml2aWFsIGltcGxlbWVudGF0aW9uIHRoYXQgeW91IHJlcGxhY2UNCi1ieSBlZGl0aW5nIHRoZSBiZWFuLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtIGtleXJlZj0idGF4aXMydGR8MXxBeGlzMnJ1bnRpbWVlbnZpcm9ubWVudHNrZWxldG9uV2Vic2VydmljZXMiDQotc3RhdHVzPSJ1bmNoYW5nZWQiPkF4aXMyIHJ1bnRpbWUgZW52aXJvbm1lbnQ8aW5kZXh0ZXJtPldlYiBzZXJ2aWNlczxpbmRleHRlcm0+c2tlbGV0b248L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtIGtleXJlZj0idGF4aXMydGR8MnxXZWJzZXJ2aWNlc0F4aXMycnVudGltZWVudmlyb25tZW50c2tlbGV0b25XZWJzZXJ2aWNlcyINCi1zdGF0dXM9InVuY2hhbmdlZCI+V2ViIHNlcnZpY2VzPGluZGV4dGVybT5BeGlzMiBydW50aW1lIGVudmlyb25tZW50PGluZGV4dGVybT5za2VsZXRvbg0KLVdlYiBzZXJ2aWNlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPHByZXJlcT48cD5QcmVyZXF1aXNpdGVzOjwvcD48b2w+DQotPGxpIGNvbnJlZj0idGF4aXMyYnUuZGl0YSN0d3NiZWFuYS9pbnN0YWxsYXhpczJsaW5rIj48L2xpPg0KLTxsaSBjb25yZWY9InRheGlzMmJ1LmRpdGEjdHdzYmVhbmEvY3JlYXRldG9tY2F0bGluayI+PC9saT4NCi08bGk+Q3JlYXRlIG9yIGltcG9ydCBhIFdTREwgZmlsZSBpbnRvIHRoZSBXZWIgQ29udGVudCBmb2xkZXIgb2YgdGhlIFdlYiBwcm9qZWN0Lg0KLVlvdSBjYW4gb25seSB1c2UgYSBXU0RMIGZpbGUgdGhhdCBjb250YWlucyBhIHNlcnZpY2UgZWxlbWVudC48L2xpPg0KLTwvb2w+PC9wcmVyZXE+DQotPGNvbnRleHQ+VG8gY3JlYXRlIGEgV2ViIHNlcnZpY2UgZnJvbSBhIFdTREwgZmlsZSB1c2luZyB0aGUgQXBhY2hlIEF4aXMyIHJ1bnRpbWUNCi1lbnZpcm9ubWVudDo8L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+U3dpdGNoIHRvIHRoZSBKYXZhIEVFIHBlcnNwZWN0aXZlICg8dWljb250cm9sPldpbmRvdyA+IE9wZW4gUGVyc3BlY3RpdmUNCi0+IEphdmEgRUU8L3VpY29udHJvbD4pLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcsIHNlbGVjdCB0aGUgV1NETCBmaWxlIHRoYXQgeW91IGNyZWF0ZWQNCi1vciBpbXBvcnRlZCBpbnRvIHRoZSBXZWIgQ29udGVudCBmb2xkZXIgb2YgeW91ciBXZWIgcHJvamVjdC48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayAgPHVpY29udHJvbD5GaWxlID4gTmV3ID4gT3RoZXI8L3VpY29udHJvbD4uIFNlbGVjdCAgPHVpY29udHJvbD5XZWINCi1TZXJ2aWNlczwvdWljb250cm9sPiBpbiBvcmRlciB0byBkaXNwbGF5IHRoZSB2YXJpb3VzIFdlYiBzZXJ2aWNlIHdpemFyZHMuDQotU2VsZWN0IHRoZSAgPHVpY29udHJvbD5XZWIgU2VydmljZTwvdWljb250cm9sPiB3aXphcmQuIENsaWNrICA8dWljb250cm9sPk5leHQ8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+V2ViIFNlcnZpY2VzIHBhZ2U6IHNlbGVjdCAgPHVpY29udHJvbD5Ub3AgZG93biBKYXZhIGJlYW4gV2ViIHNlcnZpY2U8L3VpY29udHJvbD4gYXMNCi15b3VyIFdlYiBzZXJ2aWNlIHR5cGUsIGFuZCBlbnRlciB0aGUgVVJJIHRvIHRoZSBXU0RMLCBXU0lMLCBvciBIVE1MIGZpbGUgdGhhdA0KLXdpbGwgYmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgc2VydmljZS48L2NtZD4NCi08c3Vic3RlcHMgY29ucmVmPSJ0YXhpczJidS5kaXRhI3R3c2JlYW5hL2NyZWF0ZXN0ZXA0dWwiPg0KLTxzdWJzdGVwPjxjbWQ+PC9jbWQ+PC9zdWJzdGVwPg0KLTwvc3Vic3RlcHM+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+QXhpczIgV2ViIFNlcnZpY2UgU2tlbGV0b24gPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gQmVhbiBDb25maWd1cmF0aW9uIHBhZ2U6IFNlbGVjdCB0aGUNCi1mb2xkZXIgd2hlcmUgdGhlIGdlbmVyYXRlZCA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiB3aWxsIGJlIHN0b3JlZC4gSWYgeW91IHdhbnQgdG8gcmV2aWV3DQotb3IgZWRpdCB0aGUgbWFwcGluZ3MgYmV0d2VlbiBwYWNrYWdlcyBhbmQgbmFtZXNwYWNlcywgc2VsZWN0IHRoZSAgPHVpY29udHJvbD5EZWZpbmUNCi1jdXN0b20gbWFwcGluZyBmb3IgbmFtZXNwYWNlIHRvIHBhY2thZ2U8L3VpY29udHJvbD4gY2hlY2sgYm94LiBDbGljayAgPHVpY29udHJvbD5OZXh0PC91aWNvbnRyb2w+LjwvY21kPg0KLTxzdWJzdGVwcz4NCi08c3Vic3RlcD48Y21kPlNlcnZpY2UgTmFtZTogYWNjZXB0IHRoZSBkZWZhdWx0LjwvY21kPjwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPlBvcnQgTmFtZTphY2NlcHQgdGhlIGRlZmF1bHQuPC9jbWQ+PC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+RGF0YWJpbmRpbmcgTmFtZTogT25seSB0aGUgQXhpczIgRGF0YWJpbmRpbmcgRnJhbWV3b3JrIChBREIpDQotaXMgc3VwcG9ydGVkIGF0IHRoaXMgdGltZS48L2NtZD48L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5DdXN0b20gcGFja2FnZSBuYW1lOiBZb3UgY2FuIGNoYW5nZSB0aGUgcGFja2FnZSBuYW1lIGluIHRoaXMNCi1maWVsZC48L2NtZD48L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5HZW5lcmF0ZSBhbiBJbnRlcmZhY2UgZm9yIFNrZWxldG9uPC9jbWQ+PC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+R2VuZXJhdGUgYWxsIHR5cGVzIGZvciBhbGwgZWxlbWVudHMgcmVmZXJyZWQgYnkgc2NoZW1hczwvY21kPg0KLTwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPk5hbWVzcGFjZSB0byBwYWNrYWdlIG1hcHBpbmc6IFVzZSB0aGlzIHRhYmxlIHRvIHJldmlldyBvciBlZGl0DQotdGhlIG1hcHBpbmdzIGJldHdlZW4gcGFja2FnZXMgYW5kIG5hbWVzcGFjZXMuPC9jbWQ+PC9zdWJzdGVwPg0KLTwvc3Vic3RlcHM+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+VGVzdCBXZWIgU2VydmljZSBwYWdlOiBJZiB5b3Ugc2VsZWN0ZWQgdG8gdGVzdCB0aGUgV2ViIHNlcnZpY2UsDQotc2VsZWN0IHRoZSB0ZXN0IGZhY2lsaXR5IGZvciB0aGUgZ2VuZXJhdGVkIFdlYiBzZXJ2aWNlLiBUaGlzIHdpbGwgb3BlbiB0aGUNCi1XZWIgc2VydmljZSBpbiB0aGUgV2ViIFNlcnZpY2VzIEV4cGxvcmVyLiBTZWxlY3QgdGhlIG9wZXJhdGlvbiB5b3Ugd2FudCB0bw0KLXRlc3QsIGVudGVyIHRoZSByZXF1aXJlZCBpbmZvcm1hdGlvbiwgYW5kIGNsaWNrICA8dWljb250cm9sPkdvPC91aWNvbnRyb2w+Lg0KLVRoZSByZXN1bHQgd2lsbCBkaXNwbGF5IGluIHRoZSBTdGF0dXMgcGFuZS4gQ2xpY2sgIDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXAgY29ucmVmPSJ0YXhpczJidS5kaXRhI3R3c2JlYW5hL2F4aXMyY2xpZW50cGFnZWxpbmsiPjxjbWQ+QXhpczIgQ2xpZW50DQotV2ViIHNlcnZpY2UgY29uZmlndXJhdGlvbiBwYWdlOiBVc2UgdGhpcyBwYWdlIHRvIHNlbGVjdCB0aGUgZm9sbG93aW5nIG9wdGlvbnM6IDwvY21kPg0KLTxzdWJzdGVwcz4NCi08c3Vic3RlcD48Y21kPlNlcnZpY2UgTmFtZTogPC9jbWQ+PC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+UG9ydCBOYW1lOiA8L2NtZD48L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5EYXRhYmluZGluZyBOYW1lOiBPbmx5IHRoZSBBeGlzMiBEYXRhYmluZGluZyBGcmFtZXdvcmsgKEFEQikNCi1pcyBzdXBwb3J0ZWQgYXQgdGhpcyB0aW1lLjwvY21kPjwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPkN1c3RvbSBwYWNrYWdlIG5hbWU6IFlvdSBjYW4gY2hhbmdlIHRoZSBwYWNrYWdlIG5hbWUgaW4gdGhpcw0KLWZpZWxkLjwvY21kPjwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPkNsaWVudCBtb2RlOiBZb3UgY2FuIGNob29zZSBpZiB0aGUgY2xpZW50IGlzIHN5bmNocm9ub3VzLCBhc3luY2hyb25vdXMsDQotb3IgYm90aC48L2NtZD48L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5HZW5lcmF0ZSB0ZXN0IGNhc2UgdG8gdGVzdCB0aGUgc2VydmljZTogSWYgeW91IHNlbGVjdCB0aGlzLA0KLXRoZSBBeGlzMiBlbWl0dGVyIHdpbGwgZ2VuZXJhdGUgSlVuaXQgdGVzdGNhc2VzIG1hdGNoaW5nIHRoZSBXU0RMIHByb3ZpZGVkDQotdG8gdGhlIGNsaWVudC4gVGhlc2UgSlVuaXQgdGVzdGNhc2VzIHdpbGwgYmUgZ2VuZXJhdGVkIHRvIGEgbmV3bHkgYWRkZWQgc291cmNlDQotZGlyZWN0b3J5IHRvIHRoZSBjbGllbnQgcHJvamVjdCBjYWxsZWQgPHVpY29udHJvbD50ZXN0PC91aWNvbnRyb2w+LiA8L2NtZD4NCi08L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5HZW5lcmF0ZSBhbGwgdHlwZXMgZm9yIGFsbCBlbGVtZW50cyByZWZlcnJlZCBieSBzY2hlbWFzOjwvY21kPg0KLTwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPk5hbWVzcGFjZSB0byBwYWNrYWdlIG1hcHBpbmc6IFVzZSB0aGlzIHRhYmxlIHRvIHJldmlldyBvciBlZGl0DQotdGhlIG1hcHBpbmdzIGJldHdlZW4gcGFja2FnZXMgYW5kIG5hbWVzcGFjZXMuPC9jbWQ+PC9zdWJzdGVwPg0KLTwvc3Vic3RlcHM+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+V2ViIFNlcnZpY2UgQ2xpZW50IFRlc3QgcGFnZTogVXNlIHRoaXMgcGFnZSB0byBzZWxlY3QgdGhlIGZvbGxvd2luZw0KLW9wdGlvbnM6IDwvY21kPg0KLTxzdWJzdGVwcz4NCi08c3Vic3RlcD48Y21kPlNlbGVjdCB5b3VyIHRlc3QgZmFjaWxpdHkuIFlvdSBjYW4gdGVzdCB0aGUgZ2VuZXJhdGVkIHByb3h5DQotaW4gdGhlIFdlYiBTZXJ2aWNlIEV4cGxvcmVyLCBvciB0aGUgVW5pdmVyc2FsIFRlc3QgQ2xpZW50LjwvY21kPjwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPlNlbGVjdCAgPHVpY29udHJvbD5SdW4gdGVzdCBvbiBzZXJ2ZXI8L3VpY29udHJvbD4gdG8gc3RhcnQgdGhlDQotc2VydmVyIGZvciB5b3UgYXV0b21hdGljYWxseS48L2NtZD48L3N1YnN0ZXA+DQotPC9zdWJzdGVwcz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5XZWIgU2VydmljZSBQdWJsaWNhdGlvbiBwYWdlOiBJZiB5b3UgaGF2ZSBzZWxlY3RlZCB0byBwdWJsaXNoIHlvdXINCi1XZWIgc2VydmljZSB0byBhIFVEREkgcmVnaXN0cnksIHVzZSB0aGlzIHBhZ2UgdG8gbGF1bmNoIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXINCi1hbmQgc2VsZWN0IHRoZSBVRERJIHJlZ2lzdHJ5IHRvIHdoaWNoIHRoZSBXZWIgc2VydmljZSB3aWxsIGJlIHB1Ymxpc2hlZC4gQ2xpY2sNCi0gPHVpY29udHJvbD5GaW5pc2g8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHJlc3VsdCBjb25yZWY9InRheGlzMmJ1LmRpdGEjdHdzYmVhbmEvYXhpc3dzY3JlYXRlcmVzdWx0Ij5BZnRlciB0aGUgV2ViIHNlcnZpY2UNCi1oYXMgYmVlbiBjcmVhdGVkLCB0aGUgZm9sbG93aW5nIG1heSBvY2N1ciBkZXBlbmRpbmcgb24gdGhlIG9wdGlvbnMgeW91IHNlbGVjdGVkOiA8dWw+DQotPGxpPklmIHlvdSBoYXZlIHNlbGVjdGVkIHRvIHRlc3QgdGhlIGdlbmVyYXRlZCBwcm94eSB1c2luZyBXZWIgc2VydmljZSBKU1BzLA0KLXRoZSBwcm94eSBpcyBsYXVuY2hlZCBpbiBhIFdlYiBicm93c2VyIGF0IHRoZSBmb2xsb3dpbmcgVVJMOiA8Y29kZXBoPmh0dHA6Ly9sb2NhbGhvc3Q6IDx2YXJuYW1lPnBvcnQ8L3Zhcm5hbWU+LyA8dmFybmFtZT5XZWJQcm9qZWN0PC92YXJuYW1lPkNsaWVudC9zYW1wbGU8aQ0KLT5CZWFuTmFtZTwvaT4vPHZhcm5hbWU+V2ViU2VydmljZU5hbWU8L3Zhcm5hbWU+L1Rlc3RDbGllbnQuanNwPC9jb2RlcGg+IFlvdQ0KLWNhbiB1c2UgdGhpcyBzYW1wbGUgYXBwbGljYXRpb24gdG8gdGVzdCB0aGUgV2ViIHNlcnZpY2UgYnkgc2VsZWN0aW5nIGEgbWV0aG9kLA0KLWVudGVyaW5nIGEgdmFsdWUgZm9yIHRoZSBtZXRob2QsIGFuZCBjbGlja2luZyAgPHVpY29udHJvbD5JbnZva2U8L3VpY29udHJvbD4uDQotVGhlIHJlc3VsdCBvZiB0aGUgbWV0aG9kIHdpbGwgZGlzcGxheSBpbiB0aGUgcmVzdWx0cyBwYW5lLjwvbGk+DQotPGxpPklmIHlvdSBoYXZlIHNlbGVjdGVkIHRvIHRlc3QgdGhlIFdlYiBzZXJ2aWNlIHVzaW5nIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXIsDQotdGhlIEV4cGxvcmVyIHdpbGwgb3Blbi4gU2VsZWN0IHRoZSBvcGVyYXRpb24geW91IHdhbnQgdG8gdGVzdCwgZW50ZXIgdGhlIHJlcXVpcmVkDQotaW5mb3JtYXRpb24sIGFuZCBjbGljayAgPGI+R288L2I+LiBUaGUgcmVzdWx0IHdpbGwgZGlzcGxheSBpbiB0aGUgU3RhdHVzIHBhbmUuPC9saT4NCi08bGk+SWYgeW91IGhhdmUgc2VsZWN0ZWQgdG8gcHVibGlzaCB0aGUgV2ViIHNlcnZpY2UsIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXINCi1pcyBsYXVuY2hlZCBkaXNwbGF5aW5nIHRoZSBwYWdlIHJlcXVpcmVkIHRvIHB1Ymxpc2ggeW91ciBXZWIgc2VydmljZS4gRm9sbG93DQotdGhlIGluc3RydWN0aW9ucyBpbiA8dmFybmFtZT5QdWJsaXNoaW5nIHRoZSBXZWIgc2VydmljZTwvdmFybmFtZT4gdG8gY29tcGxldGUNCi10aGlzIHRhc2suPC9saT4NCi08L3VsPjwvcmVzdWx0Pg0KLTwvdGFza2JvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmtsaXN0Pjx0aXRsZT5SZWxhdGVkIENvbmNlcHRzPC90aXRsZT4NCi08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Qud3MuZG9jLnVzZXIvY29uY2VwdHMvY3dzaW53c2EuZGl0YSIgc2NvcGU9InBlZXIiPg0KLTxsaW5rdGV4dD4gVG9vbHMgZm9yIFdlYiBzZXJ2aWNlcyBkZXZlbG9wbWVudDwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC53cy5kb2MudXNlci9jb25jZXB0cy9jd3MuZGl0YSIgc2NvcGU9InBlZXIiPg0KLTxsaW5rdGV4dD5XZWIgc2VydmljZXMgZGV2ZWxvcG1lbnQ8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtsaXN0Pg0KLTxsaW5rbGlzdD48dGl0bGU+UmVsYXRlZCBUYXNrczwvdGl0bGU+DQotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LndzLmRvYy51c2VyL3Rhc2tzL3RvdmVyd3MuZGl0YSIgc2NvcGU9InBlZXIiPg0KLTxsaW5rdGV4dD4gRGV2ZWxvcGluZyBXZWIgc2VydmljZXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuZG9jLnVzZXIvdGFza3MvdHVkZGlleHAuZGl0YSINCi1zY29wZT0icGVlciI+PGxpbmt0ZXh0PiBVc2luZyB0aGUgV2ViIFNlcnZpY2VzIEV4cGxvcmVyPC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rbGlzdD4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL3RvcGljcy90YXhpczJ0ZC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvdG9waWNzL3RheGlzMnRkLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYzQ5YjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvdG9waWNzL3RheGlzMnRkLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRpbmcgYSBKYXZhIGJlYW4gc2tlbGV0b24gZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgdGhlIEFwYWNoZSBBeGlzMiBydW50aW1lIGVudmlyb25tZW50IiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlRoZSBXZWIgc2VydmljZSB3aXphcmQgYXNzaXN0cyB5b3UgaW4gY3JlYXRpbmcgYSBza2VsZXRvbiBiZWFuIGZyb20gYW4gZXhpc3RpbmcgV1NETCBkb2N1bWVudC4gVGhlIHNrZWxldG9uIGJlYW4gY29udGFpbnMgYSBzZXQgb2YgbWV0aG9kcyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIG9wZXJhdGlvbnMgZGVzY3JpYmVkIGluIHRoZSBXU0RMIGRvY3VtZW50LiBXaGVuIHRoZSBiZWFuIGlzIGNyZWF0ZWQsIGVhY2ggbWV0aG9kIGhhcyBhIHRyaXZpYWwgaW1wbGVtZW50YXRpb24gdGhhdCB5b3UgcmVwbGFjZSBieSBlZGl0aW5nIHRoZSBiZWFuLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGUgV2ViIHNlcnZpY2Ugd2l6YXJkIGFzc2lzdHMgeW91IGluIGNyZWF0aW5nIGEgc2tlbGV0b24gYmVhbiBmcm9tIGFuIGV4aXN0aW5nIFdTREwgZG9jdW1lbnQuIFRoZSBza2VsZXRvbiBiZWFuIGNvbnRhaW5zIGEgc2V0IG9mIG1ldGhvZHMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBvcGVyYXRpb25zIGRlc2NyaWJlZCBpbiB0aGUgV1NETCBkb2N1bWVudC4gV2hlbiB0aGUgYmVhbiBpcyBjcmVhdGVkLCBlYWNoIG1ldGhvZCBoYXMgYSB0cml2aWFsIGltcGxlbWVudGF0aW9uIHRoYXQgeW91IHJlcGxhY2UgYnkgZWRpdGluZyB0aGUgYmVhbi4iIC8+Ci08bWV0YSBjb250ZW50PSJBeGlzMiBydW50aW1lIGVudmlyb25tZW50LCBXZWIgc2VydmljZXMsIHNrZWxldG9uLCBza2VsZXRvbiBXZWIgc2VydmljZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJBeGlzMiBydW50aW1lIGVudmlyb25tZW50LCBXZWIgc2VydmljZXMsIHNrZWxldG9uLCBza2VsZXRvbiBXZWIgc2VydmljZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY2F4aXMydG92ZXIuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LndzLmRvYy51c2VyL2NvbmNlcHRzL2N3c2lud3NhLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC53cy5kb2MudXNlci9jb25jZXB0cy9jd3MuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LndzLmRvYy51c2VyL3Rhc2tzL3RvdmVyd3MuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmRvYy51c2VyL3Rhc2tzL3R1ZGRpZXhwLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHNrbHdzZGxhIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+Q3JlYXRpbmcgYSBKYXZhIGJlYW4gc2tlbGV0b24gZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgdGhlCi1BcGFjaGUgQXhpczIgcnVudGltZSBlbnZpcm9ubWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHNrbHdzZGxhIj48YSBuYW1lPSJ0c2tsd3NkbGEiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNyZWF0aW5nIGEgSmF2YSBiZWFuIHNrZWxldG9uIGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIHRoZSBBcGFjaGUKLUF4aXMyIHJ1bnRpbWUgZW52aXJvbm1lbnQ8L2gxPgotCi0KLQotCi08ZGl2PjxwPlRoZSBXZWIgc2VydmljZSB3aXphcmQgYXNzaXN0cyB5b3UgaW4gY3JlYXRpbmcgYSBza2VsZXRvbiBiZWFuCi1mcm9tIGFuIGV4aXN0aW5nIFdTREwgZG9jdW1lbnQuIFRoZSBza2VsZXRvbiBiZWFuIGNvbnRhaW5zIGEgc2V0IG9mIG1ldGhvZHMKLXRoYXQgY29ycmVzcG9uZCB0byB0aGUgb3BlcmF0aW9ucyBkZXNjcmliZWQgaW4gdGhlIFdTREwgZG9jdW1lbnQuIFdoZW4gdGhlCi1iZWFuIGlzIGNyZWF0ZWQsIGVhY2ggbWV0aG9kIGhhcyBhIHRyaXZpYWwgaW1wbGVtZW50YXRpb24gdGhhdCB5b3UgcmVwbGFjZQotYnkgZWRpdGluZyB0aGUgYmVhbi48L3A+Ci0KLTxkaXYgY2xhc3M9InAiPjxwPlByZXJlcXVpc2l0ZXM6PC9wPgotPG9sPgotPGxpPllvdSBtdXN0IGhhdmUgaW5zdGFsbGVkIHRoZSBBcGFjaGUgQXhpczIgcnVudGltZQotZW52aXJvbm1lbnQgYXMgZGVzY3JpYmVkIGluOiA8YSBocmVmPSJjYXhpczJ0b3Zlci5odG1sIiB0aXRsZT0iVGhpcyBydW50aW1lIGVudmlyb25tZW50IGlzIGZvciB1c2VycyB3aG8gcHJlZmVyIHRvIGRldmVsb3AgZm9yJiMxMDt0aGUgb3BlbiBBcGFjaGUgQXhpcyBwbGF0Zm9ybS4gQm90aCBBeGlzMSBhbmQgQXhpczIgYXJlIHN1cHBvcnRlZCBieSB0aGUgV2ViJiMxMDtzZXJ2aWNlcyB0b29scy4iPkNyZWF0aW5nIFdlYiBzZXJ2aWNlcyB3aXRoIHRoZSBBcGFjaGUgQXhpczIgcnVudGltZSBlbnZpcm9ubWVudHM8L2E+PC9saT4KLQotPGxpPklmIHlvdSBhcmUgdXNpbmcgdGhlIEFwYWNoZSBKYWthcnRhIFRvbWNhdCBzZXJ2bGV0Ci1jb250YWluZXIgYXMgeW91ciBzZXJ2ZXIsIHlvdSBtdXN0IGluc3RhbGwgaXQsIGNvbmZpZ3VyZSBhbiBpbnN0YW5jZSBvZiBpdCwKLWFuZCBjcmVhdGUgYSBXZWIgcHJvamVjdCB0YXJnZXRlZCB0byBpdCBhcyBkZXNjcmliZWQgaW46IDxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLnVpLmRvYy51c2VyL3RvcGljcy90dG9tY2F0c2Vydi5odG1sIj5DcmVhdGluZyBhbiBBcGFjaGUgVG9tY2F0IHNlcnZlciBhbmQgV2ViIHByb2plY3Q8L2E+PC9saT4KLQotPGxpPkNyZWF0ZSBvciBpbXBvcnQgYSBXU0RMIGZpbGUgaW50byB0aGUgV2ViIENvbnRlbnQgZm9sZGVyIG9mIHRoZSBXZWIgcHJvamVjdC4KLVlvdSBjYW4gb25seSB1c2UgYSBXU0RMIGZpbGUgdGhhdCBjb250YWlucyBhIHNlcnZpY2UgZWxlbWVudC48L2xpPgotCi08L29sPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRvIGNyZWF0ZSBhIFdlYiBzZXJ2aWNlIGZyb20gYSBXU0RMIGZpbGUgdXNpbmcgdGhlIEFwYWNoZSBBeGlzMiBydW50aW1lCi1lbnZpcm9ubWVudDo8L2Rpdj4KLQotPG9sPgotPGxpPjxzcGFuPlN3aXRjaCB0byB0aGUgSmF2YSBFRSBwZXJzcGVjdGl2ZSAoPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93ICZndDsgT3BlbiBQZXJzcGVjdGl2ZQotJmd0OyBKYXZhIEVFPC9zcGFuPikuPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5JbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3LCBzZWxlY3QgdGhlIFdTREwgZmlsZSB0aGF0IHlvdSBjcmVhdGVkCi1vciBpbXBvcnRlZCBpbnRvIHRoZSBXZWIgQ29udGVudCBmb2xkZXIgb2YgeW91ciBXZWIgcHJvamVjdC48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkNsaWNrICA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWxlICZndDsgTmV3ICZndDsgT3RoZXI8L3NwYW4+LiBTZWxlY3QgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldlYgotU2VydmljZXM8L3NwYW4+IGluIG9yZGVyIHRvIGRpc3BsYXkgdGhlIHZhcmlvdXMgV2ViIHNlcnZpY2Ugd2l6YXJkcy4KLVNlbGVjdCB0aGUgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldlYiBTZXJ2aWNlPC9zcGFuPiB3aXphcmQuIENsaWNrICA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXh0PC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08bGk+PHNwYW4+V2ViIFNlcnZpY2VzIHBhZ2U6IHNlbGVjdCAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VG9wIGRvd24gSmF2YSBiZWFuIFdlYiBzZXJ2aWNlPC9zcGFuPiBhcwoteW91ciBXZWIgc2VydmljZSB0eXBlLCBhbmQgZW50ZXIgdGhlIFVSSSB0byB0aGUgV1NETCwgV1NJTCwgb3IgSFRNTCBmaWxlIHRoYXQKLXdpbGwgYmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgc2VydmljZS48L3NwYW4+Ci08b2wgdHlwZT0iYSI+Ci08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgc3RhZ2VzIG9mIFdlYiBzZXJ2aWNlcyBkZXZlbG9wbWVudCB0aGF0IHlvdSB3YW50Ci10byBjb21wbGV0ZSB1c2luZyB0aGUgc2xpZGVyOjwvc3Bhbj4gPHVsPgotPGxpPkRldmVsb3A6IHRoaXMgd2lsbCBkZXZlbG9wIHRoZSBXU0RMIGRlZmluaXRpb24gYW5kIGltcGxlbWVudGF0aW9uIG9mIHRoZQotV2ViIHNlcnZpY2UuIFRoaXMgaW5jbHVkZXMgc3VjaCB0YXNrcyBhcyBjcmVhdGluZyB0aGUgbW9kdWxlcyB3aGljaCB3aWxsIGNvbnRhaW4KLXRoZSBnZW5lcmF0ZWQgY29kZSwgV1NETCBmaWxlcywgZGVwbG95bWVudCBkZXNjcmlwdG9ycywgYW5kIEphdmHihKIgZmlsZXMKLXdoZW4gYXBwcm9wcmlhdGUuPC9saT4KLQotPGxpPkFzc2VtYmxlOiB0aGlzIGVuc3VyZXMgdGhlIHByb2plY3QgdGhhdCB3aWxsIGhvc3QgdGhlIFdlYiBzZXJ2aWNlIG9yIGNsaWVudAotZ2V0cyBhc3NvY2lhdGVkIHRvIGFuIEVBUiB3aGVuIHJlcXVpcmVkIGJ5IHRoZSB0YXJnZXQgYXBwbGljYXRpb24gc2VydmVyLjwvbGk+Ci0KLTxsaT5EZXBsb3k6IHRoaXMgd2lsbCBjcmVhdGUgdGhlIGRlcGxveW1lbnQgY29kZSBmb3IgdGhlIHNlcnZpY2UuPC9saT4KLQotPGxpPkluc3RhbGw6IHRoaXMgd2lsbCBpbnN0YWxsIGFuZCBjb25maWd1cmUgdGhlIFdlYiBtb2R1bGUgYW5kIEVBUnMgb24gdGhlCi10YXJnZXQgc2VydmVyLjwvbGk+Ci0KLTxsaT5TdGFydDogdGhpcyB3aWxsIHN0YXJ0IHRoZSBzZXJ2ZXIgb25jZSB0aGUgc2VydmljZSBoYXMgYmVlbiBpbnN0YWxsZWQKLW9uIGl0LiBUaGUgc2VydmVyLWNvbmZpZy53c2RkIGZpbGUgd2lsbCBiZSBnZW5lcmF0ZWQuPC9saT4KLQotPGxpPlRlc3Q6IHRoaXMgd2lsbCBwcm92aWRlIHZhcmlvdXMgb3B0aW9ucyBmb3IgdGVzdGluZyB0aGUgc2VydmljZSwgc3VjaAotYXMgdXNpbmcgdGhlIFdlYiBTZXJ2aWNlIEV4cGxvcmVyIG9yIHNhbXBsZSBKU1BzLjwvbGk+Ci0KLTwvdWw+Ci08L2xpPgotCi08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB5b3VyIHNlcnZlcjogdGhlIGRlZmF1bHQgc2VydmVyIGlzIGRpc3BsYXllZC4gSWYgeW91Ci13YW50IHRvIGRlcGxveSB5b3VyIHNlcnZpY2UgdG8gYSBkaWZmZXJlbnQgc2VydmVyIGNsaWNrIHRoZSBsaW5rIHRvIHNwZWNpZnkKLWEgZGlmZmVyZW50IHNlcnZlci48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdWJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgeW91ciBydW50aW1lOiBlbnN1cmUgdGhlIEFwYWNoZSBBeGlzMiBydW50aW1lIGlzIHNlbGVjdGVkLjwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3Vic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSBzZXJ2aWNlIHByb2plY3Q6IHRoZSBwcm9qZWN0IHNlbGVjdGVkIGluIHlvdXIgd29ya3NwYWNlCi1pcyBkaXNwbGF5ZWQuIFRvIHNlbGVjdCBhIGRpZmZlcmVudCBwcm9qZWN0IGNsaWNrIG9uIHRoZSBwcm9qZWN0IGxpbmsuIElmCi15b3UgYXJlIGRlcGxveWluZyB0byBXZWJTcGhlcmU8c3VwPsKuPC9zdXA+IEFwcGxpY2F0aW9uIFNlcnZlciB5b3Ugd2lsbCBhbHNvIGJlIGFza2VkCi10byBzZWxlY3QgdGhlIEVBUiBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2plY3QuPC9zcGFuPiBFbnN1cmUgdGhhdCB0aGUKLXByb2plY3Qgc2VsZWN0ZWQgYXMgdGhlIENsaWVudCBXZWIgUHJvamVjdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgU2VydmljZSBXZWIKLVByb2plY3QsIG9yIHRoZSBzZXJ2aWNlIHdpbGwgYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIGNsaWVudCdzIGdlbmVyYXRlZCBhcnRpZmFjdHMuCi08L2xpPgotCi08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPklmIHlvdSB3YW50IHRvIGNyZWF0ZSBhIGNsaWVudCwgc2VsZWN0IHRoZSB0eXBlIG9mIHByb3h5IHRvCi1iZSBnZW5lcmF0ZWQgYW5kIHJlcGVhdCB0aGUgYWJvdmUgc3RlcHMgZm9yIHRoZSBjbGllbnQuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3Vic3RlcGV4cGFuZCI+PHNwYW4+UHVibGlzaCB0aGUgV2ViIHNlcnZpY2U6IHRoaXMgd2lsbCBsYXVuY2ggdGhlIFdlYiBTZXJ2aWNlcyBFeHBsb3JlcgotdG8gcHVibGlzaCB5b3VyIFdlYiBzZXJ2aWNlIHRvIGEgVURESSByZWdpc3RyeS48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdWJzdGVwZXhwYW5kIj48c3Bhbj5Nb25pdG9yIHRoZSBXZWIgc2VydmljZTogdGhpcyB3aWxsIHNlbmQgdGhlIFdlYiBzZXJ2aWNlIHRyYWZmaWMKLXRocm91Z2ggdGhlIFRDUC9JUCBNb25pdG9yLCB3aGljaCBhbGxvd3MgeW91IHRvIHdhdGNoIHRoZSBTT0FQIHRyYWZmaWMgZ2VuZXJhdGVkCi1ieSB0aGUgV2ViIHNlcnZpY2UgYW5kIHRvIHRlc3QgdGhpcyB0cmFmZmljIGZvciBXUy1JIGNvbXBsaWFuY2UuIEFsdGVybmF0ZWx5Ci15b3UgY2FuIG1hbnVhbGx5IHNldCB1cCBhIFRDUC9JUCBtb25pdG9yIGFzIGRlc2NyaWJlZCBpbiA8YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3Qud3NpLnVpLmRvYy51c2VyL3Rhc2tzL3Rtb25pdG9yLmh0bWwiPlVzaW5nIHRoZSBUQ1AvSVAgTW9uaXRvciB0byB0ZXN0IFdlYiBzZXJ2aWNlczwvYT48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPC9saT4KLQotPGxpPjxzcGFuPkF4aXMyIFdlYiBTZXJ2aWNlIFNrZWxldG9uIEphdmEgQmVhbiBDb25maWd1cmF0aW9uIHBhZ2U6IFNlbGVjdCB0aGUKLWZvbGRlciB3aGVyZSB0aGUgZ2VuZXJhdGVkIEphdmEgd2lsbCBiZSBzdG9yZWQuIElmIHlvdSB3YW50IHRvIHJldmlldwotb3IgZWRpdCB0aGUgbWFwcGluZ3MgYmV0d2VlbiBwYWNrYWdlcyBhbmQgbmFtZXNwYWNlcywgc2VsZWN0IHRoZSAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RGVmaW5lCi1jdXN0b20gbWFwcGluZyBmb3IgbmFtZXNwYWNlIHRvIHBhY2thZ2U8L3NwYW4+IGNoZWNrIGJveC4gQ2xpY2sgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+Ljwvc3Bhbj4KLTxvbCB0eXBlPSJhIj4KLTxsaT48c3Bhbj5TZXJ2aWNlIE5hbWU6IGFjY2VwdCB0aGUgZGVmYXVsdC48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPlBvcnQgTmFtZTphY2NlcHQgdGhlIGRlZmF1bHQuPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5EYXRhYmluZGluZyBOYW1lOiBPbmx5IHRoZSBBeGlzMiBEYXRhYmluZGluZyBGcmFtZXdvcmsgKEFEQikKLWlzIHN1cHBvcnRlZCBhdCB0aGlzIHRpbWUuPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5DdXN0b20gcGFja2FnZSBuYW1lOiBZb3UgY2FuIGNoYW5nZSB0aGUgcGFja2FnZSBuYW1lIGluIHRoaXMKLWZpZWxkLjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+R2VuZXJhdGUgYW4gSW50ZXJmYWNlIGZvciBTa2VsZXRvbjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+R2VuZXJhdGUgYWxsIHR5cGVzIGZvciBhbGwgZWxlbWVudHMgcmVmZXJyZWQgYnkgc2NoZW1hczwvc3Bhbj4KLTwvbGk+Ci0KLTxsaT48c3Bhbj5OYW1lc3BhY2UgdG8gcGFja2FnZSBtYXBwaW5nOiBVc2UgdGhpcyB0YWJsZSB0byByZXZpZXcgb3IgZWRpdAotdGhlIG1hcHBpbmdzIGJldHdlZW4gcGFja2FnZXMgYW5kIG5hbWVzcGFjZXMuPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTwvbGk+Ci0KLTxsaT48c3Bhbj5UZXN0IFdlYiBTZXJ2aWNlIHBhZ2U6IElmIHlvdSBzZWxlY3RlZCB0byB0ZXN0IHRoZSBXZWIgc2VydmljZSwKLXNlbGVjdCB0aGUgdGVzdCBmYWNpbGl0eSBmb3IgdGhlIGdlbmVyYXRlZCBXZWIgc2VydmljZS4gVGhpcyB3aWxsIG9wZW4gdGhlCi1XZWIgc2VydmljZSBpbiB0aGUgV2ViIFNlcnZpY2VzIEV4cGxvcmVyLiBTZWxlY3QgdGhlIG9wZXJhdGlvbiB5b3Ugd2FudCB0bwotdGVzdCwgZW50ZXIgdGhlIHJlcXVpcmVkIGluZm9ybWF0aW9uLCBhbmQgY2xpY2sgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkdvPC9zcGFuPi4KLVRoZSByZXN1bHQgd2lsbCBkaXNwbGF5IGluIHRoZSBTdGF0dXMgcGFuZS4gQ2xpY2sgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaT48c3Bhbj5BeGlzMiBDbGllbnQgV2ViIHNlcnZpY2UgY29uZmlndXJhdGlvbgotcGFnZTogVXNlIHRoaXMgcGFnZSB0byBzZWxlY3QgdGhlIGZvbGxvd2luZyBvcHRpb25zOiA8L3NwYW4+Ci08b2wgdHlwZT0iYSI+Ci08bGk+PHNwYW4+U2VydmljZSBOYW1lOiBhY2NlcHQgdGhlIGRlZmF1bHQuPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5Qb3J0IE5hbWU6IGFjY2VwdCB0aGUgZGVmYXVsdC48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkRhdGFiaW5kaW5nIE5hbWU6IG9ubHkgdGhlIEF4aXMyIERhdGFiaW5kaW5nIEZyYW1ld29yayAoQURCKQotaXMgc3VwcG9ydGVkIGF0IHRoaXMgdGltZS48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkN1c3RvbSBwYWNrYWdlIG5hbWU6IFlvdSBjYW4gY2hhbmdlIHRoZSBwYWNrYWdlIG5hbWUgaW4gdGhpcwotZmllbGQuPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5DbGllbnQgbW9kZTogWW91IGNhbiBjaG9vc2UgaWYgdGhlIGNsaWVudCBpcyBzeW5jaHJvbm91cywgYXN5bmNocm9ub3VzLAotb3IgYm90aC48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkdlbmVyYXRlIHRlc3QgY2FzZSB0byB0ZXN0IHRoZSBzZXJ2aWNlOiBJZiB5b3Ugc2VsZWN0IHRoaXMsCi10aGUgQXhpczIgZW1pdHRlciB3aWxsIGdlbmVyYXRlIEpVbml0IHRlc3RjYXNlcyBtYXRjaGluZyB0aGUgV1NETCBwcm92aWRlZAotdG8gdGhlIGNsaWVudC4gVGhlc2UgSlVuaXQgdGVzdGNhc2VzIHdpbGwgYmUgZ2VuZXJhdGVkIHRvIGEgbmV3bHkgYWRkZWQgc291cmNlCi1kaXJlY3RvcnkgdG8gdGhlIGNsaWVudCBwcm9qZWN0IGNhbGxlZCA8c3BhbiBjbGFzcz0idWljb250cm9sIj50ZXN0PC9zcGFuPi4gPC9zcGFuPgotPC9saT4KLQotPGxpPjxzcGFuPkdlbmVyYXRlIGFsbCB0eXBlcyBmb3IgYWxsIGVsZW1lbnRzIHJlZmVycmVkIGJ5IHNjaGVtYXM8L3NwYW4+Ci08L2xpPgotCi08bGk+PHNwYW4+TmFtZXNwYWNlIHRvIHBhY2thZ2UgbWFwcGluZzogVXNlIHRoaXMgdGFibGUgdG8gcmV2aWV3IG9yIGVkaXQKLXRoZSBtYXBwaW5ncyBiZXR3ZWVuIHBhY2thZ2VzIGFuZCBuYW1lc3BhY2VzLjwvc3Bhbj48L2xpPgotCi08L29sPgotCi08L2xpPgotCi08bGk+PHNwYW4+V2ViIFNlcnZpY2UgQ2xpZW50IFRlc3QgcGFnZTogVXNlIHRoaXMgcGFnZSB0byBzZWxlY3QgdGhlIGZvbGxvd2luZwotb3B0aW9uczogPC9zcGFuPgotPG9sIHR5cGU9ImEiPgotPGxpPjxzcGFuPlNlbGVjdCB5b3VyIHRlc3QgZmFjaWxpdHkuIFlvdSBjYW4gdGVzdCB0aGUgZ2VuZXJhdGVkIHByb3h5Ci1pbiB0aGUgV2ViIFNlcnZpY2UgRXhwbG9yZXIsIG9yIHRoZSBVbml2ZXJzYWwgVGVzdCBDbGllbnQuPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5TZWxlY3QgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJ1biB0ZXN0IG9uIHNlcnZlcjwvc3Bhbj4gdG8gc3RhcnQgdGhlCi1zZXJ2ZXIgZm9yIHlvdSBhdXRvbWF0aWNhbGx5Ljwvc3Bhbj48L2xpPgotCi08L29sPgotCi08L2xpPgotCi08bGk+PHNwYW4+V2ViIFNlcnZpY2UgUHVibGljYXRpb24gcGFnZTogSWYgeW91IGhhdmUgc2VsZWN0ZWQgdG8gcHVibGlzaCB5b3VyCi1XZWIgc2VydmljZSB0byBhIFVEREkgcmVnaXN0cnksIHVzZSB0aGlzIHBhZ2UgdG8gbGF1bmNoIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXIKLWFuZCBzZWxlY3QgdGhlIFVEREkgcmVnaXN0cnkgdG8gd2hpY2ggdGhlIFdlYiBzZXJ2aWNlIHdpbGwgYmUgcHVibGlzaGVkLiBDbGljawotIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxkaXYgY2xhc3M9InAiPkFmdGVyIHRoZSBXZWIgc2VydmljZSBoYXMgYmVlbiBjcmVhdGVkLAotdGhlIGZvbGxvd2luZyBtYXkgb2NjdXIgZGVwZW5kaW5nIG9uIHRoZSBvcHRpb25zIHlvdSBzZWxlY3RlZDogPHVsPgotPGxpPklmIHlvdSBoYXZlIHNlbGVjdGVkIHRvIHRlc3QgdGhlIFdlYiBzZXJ2aWNlIHVzaW5nIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXIsCi10aGUgRXhwbG9yZXIgd2lsbCBvcGVuLiBTZWxlY3QgdGhlIG9wZXJhdGlvbiB5b3Ugd2FudCB0byB0ZXN0LCBlbnRlciB0aGUgcmVxdWlyZWQKLWluZm9ybWF0aW9uLCBhbmQgY2xpY2sgIDxzdHJvbmc+R288L3N0cm9uZz4uIFRoZSByZXN1bHQgd2lsbCBkaXNwbGF5IGluIHRoZSBTdGF0dXMgcGFuZS48L2xpPgotCi08bGk+SWYgeW91IGhhdmUgc2VsZWN0ZWQgdG8gcHVibGlzaCB0aGUgV2ViIHNlcnZpY2UsIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXIKLWlzIGxhdW5jaGVkIGRpc3BsYXlpbmcgdGhlIHBhZ2UgcmVxdWlyZWQgdG8gcHVibGlzaCB5b3VyIFdlYiBzZXJ2aWNlLiBGb2xsb3cKLXRoZSBpbnN0cnVjdGlvbnMgaW4gIDx2YXIgY2xhc3M9InZhcm5hbWUiPlB1Ymxpc2hpbmcgdGhlIFdlYiBzZXJ2aWNlPC92YXI+IHRvIGNvbXBsZXRlCi10aGlzIHRhc2suPC9saT4KLQotPC91bD4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy9jYXhpczJ0b3Zlci5odG1sIiB0aXRsZT0iVGhpcyBydW50aW1lIGVudmlyb25tZW50IGlzIGZvciB1c2VycyB3aG8gcHJlZmVyIHRvIGRldmVsb3AgZm9yIHRoZSBvcGVuIEFwYWNoZSBBeGlzIHBsYXRmb3JtLiBCb3RoIEF4aXMxIGFuZCBBeGlzMiBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBXZWIgc2VydmljZXMgdG9vbHMuIj5DcmVhdGluZyBXZWIgc2VydmljZXMgd2l0aCB0aGUgQXBhY2hlIEF4aXMyIHJ1bnRpbWUgZW52aXJvbm1lbnRzPC9hPjwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImxpbmtsaXN0Ij48c3Ryb25nPlJlbGF0ZWQgQ29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLQotPGRpdj48YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Qud3MuZG9jLnVzZXIvY29uY2VwdHMvY3dzaW53c2EuaHRtbCI+IFRvb2xzIGZvciBXZWIgc2VydmljZXMgZGV2ZWxvcG1lbnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC53cy5kb2MudXNlci9jb25jZXB0cy9jd3MuaHRtbCI+V2ViIHNlcnZpY2VzIGRldmVsb3BtZW50PC9hPjwvZGl2PjwvZGl2PgotCi08ZGl2IGNsYXNzPSJsaW5rbGlzdCI+PHN0cm9uZz5SZWxhdGVkIFRhc2tzPC9zdHJvbmc+PGJyIC8+Ci0KLTxkaXY+PGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LndzLmRvYy51c2VyL3Rhc2tzL3RvdmVyd3MuaHRtbCI+IERldmVsb3BpbmcgV2ViIHNlcnZpY2VzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuZG9jLnVzZXIvdGFza3MvdHVkZGlleHAuaHRtbCI+IFVzaW5nIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXI8L2E+PC9kaXY+PC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL3dzYXhpczJfcmVsdGFibGVfdG9jLmRpdGFtYXAgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci93c2F4aXMyX3JlbHRhYmxlX3RvYy5kaXRhbWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWQyNmE3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL3dzYXhpczJfcmVsdGFibGVfdG9jLmRpdGFtYXAKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIG1hcCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBNYXAvL0VOIg0KLSAibWFwLmR0ZCI+DQotPG1hcCBpZD0iYXhpczJ3ZWJzZXJ2aWNlc3JlbHRhYmxlIiB0aXRsZT0iUmVsdGFibGUgZm9yIEF4aXMgV2ViIHNlcnZpY2VzIGRvY3MiPg0KLTxyZWx0YWJsZT4NCi08cmVsaGVhZGVyPg0KLTxyZWxjb2xzcGVjIHR5cGU9ImNvbmNlcHQiPjwvcmVsY29sc3BlYz4NCi08cmVsY29sc3BlYyB0eXBlPSJ0YXNrIj48L3JlbGNvbHNwZWM+DQotPHJlbGNvbHNwZWMgdHlwZT0icmVmZXJlbmNlIj48L3JlbGNvbHNwZWM+DQotPC9yZWxoZWFkZXI+DQotPHJlbHJvdz4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jYXhpczJ0b3Zlci5kaXRhIiBuYXZ0aXRsZT0iQ3JlYXRpbmcgV2ViIHNlcnZpY2VzIHdpdGggdGhlIEFwYWNoZSBBeGlzMiBydW50aW1lIGVudmlyb25tZW50Ij4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RheGlzMmJ1LmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBhbiBBeGlzMiBXZWIgc2VydmljZSBmcm9tIGEgSmF2YSBiZWFuIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGF4aXMydGQuZGl0YSIgbmF2dGl0bGU9IkNyZWF0aW5nIGFuIEF4aXMyIFdlYiBzZXJ2aWNlIGZyb20gV1NETCI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RheGlzMmNsaWVudC5kaXRhIiBuYXZ0aXRsZT0iQ3JlYXRpbmcgYW4gQXhpczIgV2ViIHNlcnZpY2UgY2xpZW50Ij4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbD4NCi08dG9waWNyZWYgaHJlZj0iLi4vb3JnLmVjbGlwc2UuanN0LndzLmF4aXMudWkuZG9jLnVzZXIvdG9waWNzL2NheGlzdG92ZXIuZGl0YSINCi1uYXZ0aXRsZT0iQ3JlYXRpbmcgV2ViIHNlcnZpY2VzIHdpdGggdGhlIEFwYWNoZSBBeGlzMSBydW50aW1lIGVudmlyb25tZW50Ig0KLXNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2F4aXMydG92ZXIuZGl0YSIgbmF2dGl0bGU9IkNyZWF0aW5nIFdlYiBzZXJ2aWNlcyB3aXRoIHRoZSBBcGFjaGUgQXhpczIgcnVudGltZSBlbnZpcm9ubWVudCINCi1zY29wZT0ibG9jYWwiPjwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPC9yZWx0YWJsZT4NCi08L21hcD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci93c2F4aXMyX3JlbHRhYmxlX3RvYy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi51aS5kb2MudXNlci93c2F4aXMyX3JlbHRhYmxlX3RvYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNTIwZDMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvd3NheGlzMl9yZWx0YWJsZV90b2MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotCi08dG9jIGxhYmVsPSJSZWx0YWJsZSBmb3IgQXhpcyBXZWIgc2VydmljZXMgZG9jcyIvPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvd3NheGlzMmJ1aWxkX3RvYy5kaXRhbWFwIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvd3NheGlzMmJ1aWxkX3RvYy5kaXRhbWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWUxYjMxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL3dzYXhpczJidWlsZF90b2MuZGl0YW1hcAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgbWFwIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIE1hcC8vRU4iDQotICJtYXAuZHRkIj4NCi08bWFwIGFuY2hvcnJlZj0iLi4vb3JnLmVjbGlwc2UuanN0LndzLmRvYy51c2VyL3dzY3JlYXRpb250MV90b2MuZGl0YW1hcCN3c2F4aXMiDQotaWQ9IndzYXhpcyIgdGl0bGU9IndzYXhpcyI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jYXhpczJ0b3Zlci5kaXRhIiBuYXZ0aXRsZT0iQXBhY2hlIEF4aXMyIHJ1bnRpbWUiIHRvYz0ieWVzIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RheGlzMmJ1LmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBhIFdlYiBzZXJ2aWNlIGZyb20gYSBKYXZhIGJlYW4gdXNpbmcgdGhlIEFwYWNoZSBBeGlzMiBydW50aW1lIGVudmlyb25tZW50Ig0KLXNjb3BlPSJsb2NhbCI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RheGlzMnRkLmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBhIEphdmEgYmVhbiBza2VsZXRvbiBmcm9tIGEgV1NETCBkb2N1bWVudCB1c2luZyB0aGUgQXBhY2hlIEF4aXMyIHJ1bnRpbWUgZW52aXJvbm1lbnQiDQotc2NvcGU9ImxvY2FsIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGF4aXMyY2xpZW50LmRpdGEiIG5hdnRpdGxlPSJHZW5lcmF0aW5nIGEgSmF2YSBjbGllbnQgcHJveHkgYW5kIGEgc2FtcGxlIGFwcGxpY2F0aW9uIGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIHRoZSBBeGlzMiBydW50aW1lIGVudmlyb25tZW50Ig0KLXNjb3BlPSJsb2NhbCI+PC90b3BpY3JlZj4NCi08L3RvcGljcmVmPg0KLTwvbWFwPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnVpLmRvYy51c2VyL3dzYXhpczJidWlsZF90b2MueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvd3NheGlzMmJ1aWxkX3RvYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZWFmZDIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudWkuZG9jLnVzZXIvd3NheGlzMmJ1aWxkX3RvYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotCi08dG9jIGxpbmtfdG89Ii4uL29yZy5lY2xpcHNlLmpzdC53cy5kb2MudXNlci93c2NyZWF0aW9udDFfdG9jLnhtbCN3c2F4aXMiIGxhYmVsPSJ3c2F4aXMiIHRvcGljPSJ0b3BpY3MvY2F4aXMydG92ZXIuaHRtbCI+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIFdlYiBzZXJ2aWNlcyB3aXRoIHRoZSBBcGFjaGUgQXhpczIgcnVudGltZSBlbnZpcm9ubWVudHMiIGhyZWY9InRvcGljcy9jYXhpczJ0b3Zlci5odG1sIj4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYSBXZWIgc2VydmljZSBmcm9tIGEgSmF2YSBiZWFuIHVzaW5nIHRoZSBBcGFjaGUgQXhpczIgcnVudGltZSBlbnZpcm9ubWVudCIgaHJlZj0idG9waWNzL3RheGlzMmJ1Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYSBKYXZhIGJlYW4gc2tlbGV0b24gZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgdGhlIEFwYWNoZSBBeGlzMiBydW50aW1lIGVudmlyb25tZW50IiBocmVmPSJ0b3BpY3MvdGF4aXMydGQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIGEgSmF2YSBjbGllbnQgcHJveHkgYW5kIGEgc2FtcGxlIGFwcGxpY2F0aW9uIGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIHRoZSBBeGlzMiBydW50aW1lIGVudmlyb25tZW50IiBocmVmPSJ0b3BpY3MvdGF4aXMyY2xpZW50Lmh0bWwiLz4KLTwvdG9waWM+Ci08L3RvYz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi50ZXN0cy5wZXJmb3JtYW5jZS8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnRlc3RzLnBlcmZvcm1hbmNlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YzVlMzEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnRlc3RzLnBlcmZvcm1hbmNlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnRlc3RzLnBlcmZvcm1hbmNlLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnRlc3RzLnBlcmZvcm1hbmNlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWQ1YWY1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi50ZXN0cy5wZXJmb3JtYW5jZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi50ZXN0cy5wZXJmb3JtYW5jZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudGVzdHMucGVyZm9ybWFuY2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudGVzdHMucGVyZm9ybWFuY2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYjY4ZmMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnRlc3RzLnBlcmZvcm1hbmNlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudGVzdHMucGVyZm9ybWFuY2UKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnRlc3RzLnBlcmZvcm1hbmNlLkFjdGl2YXRvcgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5qc3Qud3MsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLAotIG9yZy5qdW5pdDtidW5kbGUtdmVyc2lvbj0iMy44LjAiLAotIG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cywKLSBvcmcuZWNsaXBzZS5qZW0udXRpbCwKLSBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZSwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcywKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYsCi0gb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUsCi0gb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBlcmZvcm1hbmNlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnRlc3RzLnRvbWNhdC52NTUucGVyZm1zciwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudGVzdHMucGVyZm9ybWFuY2UKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnRlc3RzLnBlcmZvcm1hbmNlL2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudGVzdHMucGVyZm9ybWFuY2UvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudGVzdHMucGVyZm9ybWFuY2UvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnRlc3RzLnBlcmZvcm1hbmNlL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudGVzdHMucGVyZm9ybWFuY2UvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJiNWI4Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudGVzdHMucGVyZm9ybWFuY2UvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGJpbi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi50ZXN0cy5wZXJmb3JtYW5jZS9wbHVnaW4ucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi50ZXN0cy5wZXJmb3JtYW5jZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBjMDFhMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudGVzdHMucGVyZm9ybWFuY2UvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSNQcm9wZXJ0aWVzIGZpbGUgZm9yIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi50ZXN0cy5wZXJmb3JtYW5jZQotQnVuZGxlLVZlbmRvciA9IEVjbGlwc2Uub3JnCi1CdW5kbGUtTmFtZSA9IEF4aXMyIFBlcmZvcm1hbmNlIFRlc3RzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvdGVzdHMvcGVyZm9ybWFuY2UvQWN0aXZhdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi90ZXN0cy9wZXJmb3JtYW5jZS9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjczZGMzYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi90ZXN0cy9wZXJmb3JtYW5jZS9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA5MDQwMiAgMjYzODczIG1haHV0Y2hAY2EuaWJtLmNvbSAtIE1hcmsgSHV0Y2hpbnNvbiwgTW92ZSBBeGlzMiBwZWZvcm1hbmNlIHRlc3RzIHRvIG5ldyBwbHVnaW4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi50ZXN0cy5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgZXh0ZW5kcyBQbHVnaW4gewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnRlc3RzLnBlcmZvcm1hbmNlIjsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBBY3RpdmF0b3IgcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBBY3RpdmF0b3IoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2lucyNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFjdGl2YXRvciBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvdGVzdHMvcGVyZm9ybWFuY2UvQWxsUGVyZm9ybWFuY2VUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvdGVzdHMvcGVyZm9ybWFuY2UvQWxsUGVyZm9ybWFuY2VUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGMxMWMxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL3Rlc3RzL3BlcmZvcm1hbmNlL0FsbFBlcmZvcm1hbmNlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDUwMiAgMTg1MjA4IHNlbmdwbEBjYS5pYm0uY29tIC0gU2VuZyBQaHVuZy1MdQotICogMjAwODAzMTMgIDEyNjc3NCBzZW5ncGxAY2EuaWJtLmNvbSAtIFNlbmcgUGh1bmctTHUKLSAqIDIwMDkwNDAyICAyNjM4NzMgbWFodXRjaEBjYS5pYm0uY29tIC0gTWFyayBIdXRjaGluc29uLCBNb3ZlIEF4aXMyIHBlZm9ybWFuY2UgdGVzdHMgdG8gbmV3IHBsdWdpbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi50ZXN0cy5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudGVzdHMudG9tY2F0LnY1NS5wZXJmbXNyLlBlcmZtc3JCVUphdmFBeGlzMlRDNTU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnRlc3RzLnRvbWNhdC52NTUucGVyZm1zci5QZXJmbXNyQ2xpZW50QXhpczJUQzU1OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi50ZXN0cy50b21jYXQudjU1LnBlcmZtc3IuUGVyZm1zclRESmF2YUF4aXMyVEM1NTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMuYXhpcy50b21jYXQudjUwLnBlcmZtc3IuUGVyZm1zckJVSmF2YUF4aXNUQzUwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5heGlzLnRvbWNhdC52NTAucGVyZm1zci5QZXJmbXNyQ2xpZW50QXhpc1RDNTA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLmF4aXMudG9tY2F0LnY1MC5wZXJmbXNyLlBlcmZtc3JUREphdmFBeGlzVEM1MDsKLQotcHVibGljIGNsYXNzIEFsbFBlcmZvcm1hbmNlVGVzdHMgewotCQotICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgCi0gICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgiVGVzdCBmb3Igb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnRlc3RzLnBlcmZvcm1hbmNlIik7Ci0gICAgLy8kSlVuaXQtQkVHSU4kCi0gICAgCi0gIAotCS8vIENoZWNrIGZvciBUb21jYXQgNS41IHNlcnZlcgotCVN0cmluZyBzID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC41NSIpOwotCWlmIChzPT1udWxsKXsKLQkJcyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidG9tY2F0NTVEaXIiKTsKLQl9Ci0JCi0JaWYgKHMgIT0gbnVsbCAmJiBzLmxlbmd0aCgpID4gMCkgewotCSAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoUGVyZm1zckJVSmF2YUF4aXMyVEM1NS5jbGFzcyk7Ci0JICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShQZXJmbXNyVERKYXZhQXhpczJUQzU1LmNsYXNzKTsKLQkgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFBlcmZtc3JDbGllbnRBeGlzMlRDNTUuY2xhc3MpOwotCX0gZWxzZSB7Ci0JCVN5c3RlbS5lcnIucHJpbnRsbigiV2FybmluZzogVG9tY2F0IDUuNSBub3QgZm91bmQgLSBwZXJmb3JtYW5jZSB0ZXN0cyBza2lwcGVkIik7Ci0JfQotCQotICAgIC8vJEpVbml0LUVORCQKLSAgICByZXR1cm4gc3VpdGU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL3Rlc3RzL3RvbWNhdC92NTUvV1NXaXphcmRUb21jYXQ1NVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL3Rlc3RzL3RvbWNhdC92NTUvV1NXaXphcmRUb21jYXQ1NVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcxNWMzOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi90ZXN0cy90b21jYXQvdjU1L1dTV2l6YXJkVG9tY2F0NTVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzA3MDUgIDE5NTU1MyBzZW5ncGxAY2EuaWJtLmNvbSAtIFNlbmcgUGh1bmctTHUKLSAqIDIwMDkwNDAyICAyNjM4NzMgbWFodXRjaEBjYS5pYm0uY29tIC0gTWFyayBIdXRjaGluc29uLCBNb3ZlIEF4aXMyIHBlZm9ybWFuY2UgdGVzdHMgdG8gbmV3IHBsdWdpbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnRlc3RzLnRvbWNhdC52NTU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIuY29yZS5jb250ZXh0LkF4aXMyRW1pdHRlckNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLmNvcmUucGx1Z2luLldlYlNlcnZpY2VBeGlzMkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLldTV2l6YXJkVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMudXRpbC5KVW5pdFV0aWxzOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgV1NXaXphcmRUb21jYXQ1NVRlc3QgZXh0ZW5kcyBXU1dpemFyZFRlc3QgewotICAKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFNFUlZFUl9JTlNUQUxMX1BBVEggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjU1Iik7Ci0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBSVU5USU1FX0lOU1RBTExfUEFUSCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3JnLmVjbGlwc2UuanN0LnJ1bnRpbWUuYXhpczIiKTsKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFJVTlRJTUVUWVBFSURfVEM1NSA9ICJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjU1IjsKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFNFUlZFUlRZUEVJRF9UQzU1ID0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjU1IjsKLQkgIAotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBjb20uaWJtLmV0b29scy53ZWJzZXJ2aWNlLndhcy50ZXN0cy5XU1dpemFyZFRlc3QjaW5zdGFsbFNlcnZlclJ1bnRpbWUoKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgaW5zdGFsbFNlcnZlclJ1bnRpbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCS8vIGNyZWF0ZSBzZXJ2ZXIgcnVudGltZQotICAgIHNlcnZlclJ1bnRpbWVfID0gSlVuaXRVdGlscy5jcmVhdGVTZXJ2ZXJSdW50aW1lKFJVTlRJTUVUWVBFSURfVEM1NSwgU0VSVkVSX0lOU1RBTExfUEFUSCk7Ci0gICAgCi0gICAgLy8gc2V0IGluc3RhbGwgbG9jYXRpb25zCi0gICAgQXhpczJFbWl0dGVyQ29udGV4dCBjb250ZXh0ID0gV2ViU2VydmljZUF4aXMyQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QXhpc0VtaXR0ZXJDb250ZXh0KCk7Ci0gICAgaWYgKGNvbnRleHQuZ2V0QXhpczJSdW50aW1lTG9jYXRpb24oKT09bnVsbCB8fCBjb250ZXh0LmdldEF4aXMyUnVudGltZUxvY2F0aW9uKCkuZXF1YWxzKCIiKSl7Ci0gICAgCVN0cmluZyBydW50aW1lUGF0aCA9IFJVTlRJTUVfSU5TVEFMTF9QQVRIOwotICAgIAlpZiAocnVudGltZVBhdGghPW51bGwpIHsKLSAgICAJCSBjb250ZXh0LnNldEF4aXMyUnVudGltZUxvY2F0aW9uKHJ1bnRpbWVQYXRoKTsKLSAgICAJfSAgICAgICAgCi0gICAgfQotICB9Ci0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgY29tLmlibS5ldG9vbHMud2Vic2VydmljZS53YXMudGVzdHMuV1NXaXphcmRUZXN0I2luc3RhbGxTZXJ2ZXIoKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgaW5zdGFsbFNlcnZlcigpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgc2VydmVyXyA9IEpVbml0VXRpbHMuY3JlYXRlU2VydmVyKCJBcGFjaGUgVG9tY2F0IHY1NSIsIFNFUlZFUlRZUEVJRF9UQzU1LCBzZXJ2ZXJSdW50aW1lXywgZW52XywgbnVsbCApOwotICB9Ci0gIAotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi90ZXN0cy90b21jYXQvdjU1L3BlcmZtc3IvUGVyZm1zckJVSmF2YUF4aXMyVEM1NS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvdGVzdHMvdG9tY2F0L3Y1NS9wZXJmbXNyL1BlcmZtc3JCVUphdmFBeGlzMlRDNTUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU1YjIwMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi90ZXN0cy90b21jYXQvdjU1L3BlcmZtc3IvUGVyZm1zckJVSmF2YUF4aXMyVEM1NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDcwNSAgMTk1NTUzIHNlbmdwbEBjYS5pYm0uY29tIC0gU2VuZyBQaHVuZy1MdQotICogMjAwODAzMTMgIDEyNjc3NCBzZW5ncGxAY2EuaWJtLmNvbSAtIFNlbmcgUGh1bmctTHUKLSAqIDIwMDkwNDAyICAyNjM4NzMgbWFodXRjaEBjYS5pYm0uY29tIC0gTWFyayBIdXRjaGluc29uLCBNb3ZlIEF4aXMyIHBlZm9ybWFuY2UgdGVzdHMgdG8gbmV3IHBsdWdpbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi50ZXN0cy50b21jYXQudjU1LnBlcmZtc3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi50ZXN0cy50b21jYXQudjU1LldTV2l6YXJkVG9tY2F0NTVUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMucGVyZm9ybWFuY2UudXRpbC5QZXJmb3JtYW5jZUpVbml0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnVuaXR0ZXN0LldTSlVuaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnV0aWwuSlVuaXRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMudXRpbC5TY2VuYXJpb0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLlBlcmZvcm1hbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2VNZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuZWNsaXBzZS5BY2N1bXVsYXRlU3RhdHVzSGFuZGxlcjsKLQotLyoqCi0gKiBCb3R0b20gdXAgcGVyZm9ybWFuY2Ugc2NlbmFyaW8gd2l0aCBBeGlzMiBhbmQgVG9tY2F0IHY1LjUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFBlcmZtc3JCVUphdmFBeGlzMlRDNTUgZXh0ZW5kcyBXU1dpemFyZFRvbWNhdDU1VGVzdCB7Ci0JLy8gQ29uc3RhbnRzCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgV1NfUlVOVElNRUlEX0FYSVMgPSAgV1NKVW5pdENvbnN0YW50cy5XU19SVU5USU1FSURfQVhJUzI7IAotCXByaXZhdGUgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRSA9ICJCVUF4aXMyV2ViIjsKLSAgICAKLQlwcml2YXRlIElGaWxlIHNvdXJjZUZpbGVfOwotCQotICAvKioKLSAgICogU2V0cyB1cCB0aGUgaW5wdXQgZGF0YTsKLSAgICogLSBjcmVhdGUgcHJvamVjdChzKSwKLSAgICogLSBjb3B5IHJlc291cmNlcyB0byB3b3Jrc3BhY2UgCi0gICAqLwotCXByb3RlY3RlZCB2b2lkIGluc3RhbGxJbnB1dERhdGEoKSB0aHJvd3MgRXhjZXB0aW9uCi0JewotICAgIAotCQlJUHJvamVjdCB3ZWJQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KFBST0pFQ1RfTkFNRSk7Ci0gICAgICAgIElQYXRoIGRlc3RQYXRoID0gUmVzb3VyY2VVdGlscy5nZXRKYXZhU291cmNlTG9jYXRpb24od2ViUHJvamVjdCk7Ci0gICAgICAgIElGb2xkZXIgZm9sZGVyID0gKElGb2xkZXIpUmVzb3VyY2VVdGlscy5maW5kUmVzb3VyY2UoZGVzdFBhdGgpOwkJCi0JCUpVbml0VXRpbHMuY29weVRlc3REYXRhKCJCVUphdmEvc3JjIixmb2xkZXIsZW52XywgbnVsbCk7Ci0JCXNvdXJjZUZpbGVfID0gZm9sZGVyLmdldEZpbGUobmV3IFBhdGgoImZvby9FY2hvLmphdmEiKSk7Ci0JCS8vIEVuc3VyZSB0aGF0IEVjaG8uY2xhc3MgaXMgYnVpbHQgaW46Ci0JCS8vIDxXZWIgUHJvamVjdD4vV2ViQ29udGVudC9XRUItSU5GL2NsYXNzZXMvZm9vL0VjaG8uY2xhc3MKLQkJSlVuaXRVdGlscy5kaXNhYmxlVmFsaWRhdGlvbih3ZWJQcm9qZWN0KTsKLQkJSlVuaXRVdGlscy5zeW5jQnVpbGRQcm9qZWN0KHdlYlByb2plY3QsZW52XywgbnVsbCk7Ci0JCS8vYXNzZXJ0VHJ1ZShKVW5pdFV0aWxzLmdldENsYXNzZXNGb2xkZXJGb3JXZWJQcm9qZWN0KFdFQl9QUk9KRUNUX05BTUUpLmdldEZpbGUobmV3IFBhdGgoImZvby9FY2hvLmNsYXNzIikpLmV4aXN0cygpKTsKLQkJCi0JCQotCX0KLQkKLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQcm9qZWN0cygpIHRocm93cyBFeGNlcHRpb257Ci0gICAgICAgIElQcm9qZWN0IHdlYlByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoUFJPSkVDVF9OQU1FKTsKLSAgICAgICAgaWYgKHdlYlByb2plY3Q9PW51bGwgfHwgIXdlYlByb2plY3QuZXhpc3RzKCkpewotICAgICAgICAgIEpVbml0VXRpbHMuY3JlYXRlV2ViTW9kdWxlKFBST0pFQ1RfTkFNRSwgUFJPSkVDVF9OQU1FLCBzZXJ2ZXJfLmdldElkKCksIFNFUlZFUlRZUEVJRF9UQzU1LCAiMTQiLCBlbnZfLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgfQotICAgICAgfQotCQotICAvKioKLSAgICogU2V0IHRoZSBwZXJzaXN0ZW50IHNlcnZlciBydW50aW1lIGNvbnRleHQgcHJlZmVyZW5jZXMKLSAgICovICAKLQlwcm90ZWN0ZWQgdm9pZCBpbml0SjJFRVdTUnVudGltZVNlcnZlckRlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJLy8gU2V0IGRlZmF1bHQgcHJlZmVyZW5jZXMgZm9yIEF4aXMyIGFuZCBUb21jYXQgNS41Ci0JCUpVbml0VXRpbHMuc2V0V1NSdW50aW1lU2VydmVyKFdTX1JVTlRJTUVJRF9BWElTLCBTRVJWRVJUWVBFSURfVEM1NSk7CQkKLQkJSlVuaXRVdGlscy5zZXRTZXJ2aWNlU2NlbmFyaW9EZWZhdWx0KCk7Ci0JfQotCQotICAvKioKLSAgICogU2V0IHRoZSBpbml0aWFsIHNlbGVjdGlvbgotICAgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0SW5pdGlhbFNlbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCWluaXRpYWxTZWxlY3Rpb25fID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc291cmNlRmlsZV8pOwotCX0KLQkKLSAgLyoqCi0gICAqIExhdW5jaGVzIHRoZSBwb3AtdXAgY29tbWFuZCB0byBpbml0aWF0ZSB0aGUgc2NlbmFyaW8KLSAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICovICAKLQlwdWJsaWMgdm9pZCB0ZXN0QlVKYXZhQXhpczJUQzU1KCkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkgIAlJU3RhdHVzW10gc3RhdHVzOwotCSAgICBJUHJvamVjdCB3ZWJQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KFBST0pFQ1RfTkFNRSk7Ci0JICAgIEpVbml0VXRpbHMuZGlzYWJsZVdTSURpYWxvZyh3ZWJQcm9qZWN0KTsKLQkJSlVuaXRVdGlscy5lbmFibGVPdmVyd3JpdGUodHJ1ZSk7Ci0JICAgIEpVbml0VXRpbHMuc2V0UnVudGltZVByZWZlcmVuY2UoV1NfQVhJUzJfUlVOVElNRSk7Ci0KLQkgICAgCi0JICAgIFBlcmZvcm1hbmNlIHBlcmY9IFBlcmZvcm1hbmNlLmdldERlZmF1bHQoKTsKLQkgICAgUGVyZm9ybWFuY2VNZXRlciBwZXJmb3JtYW5jZU1ldGVyPSBwZXJmLmNyZWF0ZVBlcmZvcm1hbmNlTWV0ZXIocGVyZi5nZXREZWZhdWx0U2NlbmFyaW9JZCh0aGlzKSk7CSAgICAKLQkgICAgdHJ5IHsKLSAgICAKLQkgICAgICBwZXJmb3JtYW5jZU1ldGVyLnN0YXJ0KCk7Ci0JICAgICAgc3RhdHVzID0gUGVyZm9ybWFuY2VKVW5pdFV0aWxzLmxhdW5jaENyZWF0aW9uV2l6YXJkKFNjZW5hcmlvQ29uc3RhbnRzLldJWkFSRElEX0JPVFRPTV9VUCxTY2VuYXJpb0NvbnN0YW50cy5PQkpFQ1RfQ0xBU1NfSURfSUZJTEUsaW5pdGlhbFNlbGVjdGlvbl8pOwotCSAgICAgIHBlcmZvcm1hbmNlTWV0ZXIuc3RvcCgpOwotCi0JICAgICAgcGVyZm9ybWFuY2VNZXRlci5jb21taXQoKTsKLQkgICAgICBwZXJmLmFzc2VydFBlcmZvcm1hbmNlKHBlcmZvcm1hbmNlTWV0ZXIpOwotCSAgICB9Ci0JICAgIGZpbmFsbHkgewotCSAgICAJaWYgKHBlcmZvcm1hbmNlTWV0ZXI9PW51bGwpCi0JICAgIAkJcGVyZm9ybWFuY2VNZXRlci5kaXNwb3NlKCk7Ci0JIAl9Ci0JCQotCSAgICB2ZXJpZnlPdXRwdXQoc3RhdHVzKTsKLQkJCi0JfQotCQotICAvKioKLSAgICogVmVyaWZ5IHRoZSBzY2VuYXJpbyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Ci0gICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAqLwotCXByaXZhdGUgZmluYWwgdm9pZCB2ZXJpZnlPdXRwdXQoSVN0YXR1c1tdIHN0YXR1cykgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLSAgICAgICAgSVByb2plY3Qgd2ViUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChQUk9KRUNUX05BTUUpOyAgICAKLQkJSUZvbGRlciB3ZWJDb250ZW50Rm9sZGVyID0gKElGb2xkZXIpSjJFRVV0aWxzLmdldFdlYkNvbnRlbnRDb250YWluZXIod2ViUHJvamVjdCk7Ci0gICAgCi0gICAgICAgIElGb2xkZXIgd2ViSW5mRm9sZGVyID0gd2ViQ29udGVudEZvbGRlci5nZXRGb2xkZXIoIldFQi1JTkYiKTsKLSAgICAgICAgSUZvbGRlciBzZXJ2aWNlc0ZvbGRlciA9IHdlYkluZkZvbGRlci5nZXRGb2xkZXIoInNlcnZpY2VzIik7Ci0JCWFzc2VydFRydWUoc2VydmljZXNGb2xkZXIuZXhpc3RzKCkpOwotCQlJRm9sZGVyIHdzRm9sZGVyID0gc2VydmljZXNGb2xkZXIuZ2V0Rm9sZGVyKCJFY2hvIik7Ci0JCWFzc2VydFRydWUod3NGb2xkZXIuZXhpc3RzKCkpOwotCQlhc3NlcnRUcnVlKHdzRm9sZGVyLm1lbWJlcnMoKS5sZW5ndGggPiAwKTsKLSAgICAKLQkJQWNjdW11bGF0ZVN0YXR1c0hhbmRsZXIgc3RhdHVzSGFuZGxlciA9IG5ldyBBY2N1bXVsYXRlU3RhdHVzSGFuZGxlcihzdGF0dXMpOwotCQlJU3RhdHVzW10gcyA9IHN0YXR1c0hhbmRsZXIuZ2V0RXJyb3JSZXBvcnRzKCk7Ci0JCS8vc2hvdyBlcnJvcnMKLQkJaWYgKHMubGVuZ3RoID4gMCl7Ci0JCQlmb3IgKGludCBpPTA7aTxzLmxlbmd0aDtpKyspewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQlVKYXZhIEVycm9yIG1lc3NhZ2UgZm9yIHJlcG9ydCAjIitpKyI6ICIrc1tpXS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUocy5sZW5ndGggPT0gMCk7Ci0JfQotCQotICAvKioKLSAgICogQ2xlYXIgd29ya3NwYWNlIGlmIG5lY2Vzc2FyeQotICAgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVJbnB1dERhdGEoKSB0aHJvd3MgRXhjZXB0aW9uCi0JewotCQkvLyBSZW1vdmUgdGhlIEVBUiBmcm9tIHRoZSBzZXJ2ZXIuCi0JCUlQcm9qZWN0IHdlYlByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoUFJPSkVDVF9OQU1FKTsKLQkJLy9KVW5pdFV0aWxzLnJlbW92ZU1vZHVsZUZyb21TZXJ2ZXIoc2VydmVyXyx3ZWJQcm9qZWN0LGVudl8pOwotCQkKLQkJLy8gRGVsZXRlIHRoZSBXZWIgcHJvamVjdC4KLQkJd2ViUHJvamVjdC5kZWxldGUodHJ1ZSx0cnVlLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RmFsc2Uod2ViUHJvamVjdC5leGlzdHMoKSk7Ci0JCQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL3Rlc3RzL3RvbWNhdC92NTUvcGVyZm1zci9QZXJmbXNyQ2xpZW50QXhpczJUQzU1LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi90ZXN0cy90b21jYXQvdjU1L3BlcmZtc3IvUGVyZm1zckNsaWVudEF4aXMyVEM1NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDliNDhiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzMi50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMyL3Rlc3RzL3RvbWNhdC92NTUvcGVyZm1zci9QZXJmbXNyQ2xpZW50QXhpczJUQzU1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcwNzA1ICAxOTU1NTMgc2VuZ3BsQGNhLmlibS5jb20gLSBTZW5nIFBodW5nLUx1Ci0gKiAyMDA4MDMxMyAgMTI2Nzc0IHNlbmdwbEBjYS5pYm0uY29tIC0gU2VuZyBQaHVuZy1MdQotICogMjAwOTA0MDIgIDI2Mzg3MyBtYWh1dGNoQGNhLmlibS5jb20gLSBNYXJrIEh1dGNoaW5zb24sIE1vdmUgQXhpczIgcGVmb3JtYW5jZSB0ZXN0cyB0byBuZXcgcGx1Z2luCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnRlc3RzLnRvbWNhdC52NTUucGVyZm1zcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnRlc3RzLnRvbWNhdC52NTUuV1NXaXphcmRUb21jYXQ1NVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS51dGlsLlBlcmZvcm1hbmNlSlVuaXRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMudW5pdHRlc3QuV1NKVW5pdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMudXRpbC5KVW5pdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy51dGlsLlNjZW5hcmlvQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZU1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5lY2xpcHNlLkFjY3VtdWxhdGVTdGF0dXNIYW5kbGVyOwotCi0vKioKLSAqIENsaWVudCBwZXJmb3JtYW5jZSBzY2VuYXJpbyB3aXRoIEF4aXMyIGFuZCBUb21jYXQgdjUuNQotICovCi1wdWJsaWMgY2xhc3MgUGVyZm1zckNsaWVudEF4aXMyVEM1NSBleHRlbmRzIFdTV2l6YXJkVG9tY2F0NTVUZXN0IHsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIFdTX1JVTlRJTUVJRF9BWElTID0gV1NKVW5pdENvbnN0YW50cy5XU19SVU5USU1FSURfQVhJUzI7Ci0gIAotCXByaXZhdGUgZmluYWwgU3RyaW5nIENMSUVOVF9QUk9KRUNUX05BTUUgPSAiQ2xpZW50QXhpczJXZWIiOwotCQotCXByaXZhdGUgSUZpbGUgc291cmNlRmlsZV87Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQcm9qZWN0cygpIHRocm93cyBFeGNlcHRpb257Ci0gICAgICAgIElQcm9qZWN0IHdlYlByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoQ0xJRU5UX1BST0pFQ1RfTkFNRSk7Ci0gICAgICAgIGlmICghd2ViUHJvamVjdC5leGlzdHMoKSl7Ci0gICAgICAgICAgSlVuaXRVdGlscy5jcmVhdGVXZWJNb2R1bGUoQ0xJRU5UX1BST0pFQ1RfTkFNRSwgQ0xJRU5UX1BST0pFQ1RfTkFNRSwgc2VydmVyXy5nZXRJZCgpLFNFUlZFUlRZUEVJRF9UQzU1LCAiMTQiLCBlbnZfLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0JLyoqCi0gICAqIFNldHMgdXAgdGhlIGlucHV0IGRhdGE7Ci0gICAqIC0gY3JlYXRlIHByb2plY3QocyksCi0gICAqIC0gY29weSByZXNvdXJjZXMgdG8gd29ya3NwYWNlIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluc3RhbGxJbnB1dERhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCi0JCUlQcm9qZWN0IHdlYlByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoQ0xJRU5UX1BST0pFQ1RfTkFNRSk7Ci0gICAgICAgIElGb2xkZXIgZGVzdEZvbGRlciA9IChJRm9sZGVyKUoyRUVVdGlscy5nZXRXZWJDb250ZW50Q29udGFpbmVyKHdlYlByb2plY3QpOwotICAgICAgICBKVW5pdFV0aWxzLmNvcHlUZXN0RGF0YSgiVERKYXZhIixkZXN0Rm9sZGVyLGVudl8sIG51bGwpOwotCQlzb3VyY2VGaWxlXyA9IGRlc3RGb2xkZXIuZ2V0RmlsZShuZXcgUGF0aCgiRWNoby53c2RsIikpOwkKLQkJSlVuaXRVdGlscy5kaXNhYmxlVmFsaWRhdGlvbih3ZWJQcm9qZWN0KTsKLQkJSlVuaXRVdGlscy5zeW5jQnVpbGRQcm9qZWN0KHdlYlByb2plY3QsZW52XywgbnVsbCk7Ci0JCQotCX0KLQotICAvKioKLSAgICogU2V0IHRoZSBwZXJzaXN0ZW50IHNlcnZlciBydW50aW1lIGNvbnRleHQgcHJlZmVyZW5jZXMKLSAgICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEoyRUVXU1J1bnRpbWVTZXJ2ZXJEZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBTZXQgZGVmYXVsdCBwcmVmZXJlbmNlcyBmb3IgQXhpcyBhbmQgVG9tY2F0IDUuNSAgIAotCQlKVW5pdFV0aWxzLnNldFdTUnVudGltZVNlcnZlcihXU19SVU5USU1FSURfQVhJUywgU0VSVkVSVFlQRUlEX1RDNTUpOwotCQlKVW5pdFV0aWxzLnNldENsaWVudFNjZW5hcmlvRGVmYXVsdCgpOwotCX0KLQotICAvKioKLSAgICogU2V0IHRoZSBpbml0aWFsIHNlbGVjdGlvbgotICAgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0SW5pdGlhbFNlbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlpbml0aWFsU2VsZWN0aW9uXyA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNvdXJjZUZpbGVfKTsKLQl9Ci0KLSAgLyoqCi0gICAqIExhdW5jaGVzIHRoZSBwb3AtdXAgY29tbWFuZCB0byBpbml0aWF0ZSB0aGUgc2NlbmFyaW8KLSAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICovCi0JcHVibGljIHZvaWQgdGVzdENsaWVudEF4aXMyVEM1NSgpIHRocm93cyBFeGNlcHRpb24KLQl7CQotCSAgCUlTdGF0dXNbXSBzdGF0dXM7Ci0JICAJCi0JCUpVbml0VXRpbHMuZW5hYmxlUHJveHlHZW5lcmF0aW9uKHRydWUpOwotCQlKVW5pdFV0aWxzLmVuYWJsZU92ZXJ3cml0ZSh0cnVlKTsKLQkJSlVuaXRVdGlscy5zZXRSdW50aW1lUHJlZmVyZW5jZShXU19BWElTMl9SVU5USU1FKTsKLQotCQkKLQkJUGVyZm9ybWFuY2UgcGVyZj0gUGVyZm9ybWFuY2UuZ2V0RGVmYXVsdCgpOwotCQlQZXJmb3JtYW5jZU1ldGVyIHBlcmZvcm1hbmNlTWV0ZXI9IHBlcmYuY3JlYXRlUGVyZm9ybWFuY2VNZXRlcihwZXJmLmdldERlZmF1bHRTY2VuYXJpb0lkKHRoaXMpKTsJICAgIAotCSAgICB0cnkgewotICAgIAotCSAgICAgIHBlcmZvcm1hbmNlTWV0ZXIuc3RhcnQoKTsKLQkgICAgICBzdGF0dXMgPSBQZXJmb3JtYW5jZUpVbml0VXRpbHMubGF1bmNoQ3JlYXRpb25XaXphcmQoU2NlbmFyaW9Db25zdGFudHMuV0laQVJESURfQ0xJRU5ULFNjZW5hcmlvQ29uc3RhbnRzLk9CSkVDVF9DTEFTU19JRF9JRklMRSxpbml0aWFsU2VsZWN0aW9uXyk7Ci0JICAgICAgcGVyZm9ybWFuY2VNZXRlci5zdG9wKCk7Ci0JICAgICAgcGVyZm9ybWFuY2VNZXRlci5jb21taXQoKTsKLQkgICAgICBwZXJmLmFzc2VydFBlcmZvcm1hbmNlKHBlcmZvcm1hbmNlTWV0ZXIpOwotCSAgICB9Ci0JICAgIGZpbmFsbHkgewotCSAgICAJaWYgKHBlcmZvcm1hbmNlTWV0ZXI9PW51bGwpCi0JICAgIAkJcGVyZm9ybWFuY2VNZXRlci5kaXNwb3NlKCk7Ci0JIAl9Ci0JICAgIAotCSAgICB2ZXJpZnlPdXRwdXQoc3RhdHVzKTsKLQotCi0JfQotCQotICAvKioKLSAgICogVmVyaWZ5IHRoZSBzY2VuYXJpbyBjb21wbGV0ZWQgc3VjY2VzZnVsbHkKLSAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIHZlcmlmeU91dHB1dChJU3RhdHVzW10gc3RhdHVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSVByb2plY3Qgd2ViUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChDTElFTlRfUFJPSkVDVF9OQU1FKTsKLSAgICAKLSAgICAgICAgSVBhdGggZGVzdFBhdGggPSBSZXNvdXJjZVV0aWxzLmdldEphdmFTb3VyY2VMb2NhdGlvbih3ZWJQcm9qZWN0KTsKLSAgICAgICAgSUZvbGRlciBzcmNGb2xkZXIgPSAoSUZvbGRlcilSZXNvdXJjZVV0aWxzLmZpbmRSZXNvdXJjZShkZXN0UGF0aCk7Ci0gICAgCi0JCS8vSUZvbGRlciBzcmNGb2xkZXIgPSBKVW5pdFV0aWxzLmdldFNvdXJjZUZvbGRlckZvcldlYlByb2plY3QoQ0xJRU5UX1BST0pFQ1RfTkFNRSk7Ci0JCUlGb2xkZXIgZm9sZGVyID0gc3JjRm9sZGVyLmdldEZvbGRlcigiZm9vIik7Ci0JCWFzc2VydFRydWUoZm9sZGVyLmV4aXN0cygpKTsKLQkJYXNzZXJ0VHJ1ZShmb2xkZXIubWVtYmVycygpLmxlbmd0aCA+IDApOwotCQkKLQkJQWNjdW11bGF0ZVN0YXR1c0hhbmRsZXIgc3RhdHVzSGFuZGxlciA9IG5ldyBBY2N1bXVsYXRlU3RhdHVzSGFuZGxlcihzdGF0dXMpOwotCQlJU3RhdHVzW10gcyA9IHN0YXR1c0hhbmRsZXIuZ2V0RXJyb3JSZXBvcnRzKCk7Ci0JCS8vCi0JCWlmIChzLmxlbmd0aCA+IDApewotCQkJZm9yIChpbnQgaT0wO2k8cy5sZW5ndGg7aSsrKXsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIG1lc3NhZ2UgZm9yIHJlcG9ydCAjIitpKyI6ICIrc1tpXS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUocy5sZW5ndGggPT0gMCk7ICAgICAgIAotCi0JfQotCQotICAvKioKLSAgICogUmVtb3ZlIHdvcmtzcGFjZSBpZiBuZWNlc3NhcnkKLSAgICovCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlSW5wdXREYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJLy8gRGVsZXRlIHRoZSBXZWIgcHJvamVjdC4KLQkJSVByb2plY3Qgd2ViUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChDTElFTlRfUFJPSkVDVF9OQU1FKTsKLQkJd2ViUHJvamVjdC5kZWxldGUodHJ1ZSx0cnVlLCBudWxsKTsKLQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi90ZXN0cy90b21jYXQvdjU1L3BlcmZtc3IvUGVyZm1zclRESmF2YUF4aXMyVEM1NS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpczIvdGVzdHMvdG9tY2F0L3Y1NS9wZXJmbXNyL1BlcmZtc3JUREphdmFBeGlzMlRDNTUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk1M2JiYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpczIudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzMi90ZXN0cy90b21jYXQvdjU1L3BlcmZtc3IvUGVyZm1zclRESmF2YUF4aXMyVEM1NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MDcwNSAgMTk1NTUzIHNlbmdwbEBjYS5pYm0uY29tIC0gU2VuZyBQaHVuZy1MdQotICogMjAwODAzMTMgIDEyNjc3NCBzZW5ncGxAY2EuaWJtLmNvbSAtIFNlbmcgUGh1bmctTHUKLSAqIDIwMDkwNDAyICAyNjM4NzMgbWFodXRjaEBjYS5pYm0uY29tIC0gTWFyayBIdXRjaGluc29uLCBNb3ZlIEF4aXMyIHBlZm9ybWFuY2UgdGVzdHMgdG8gbmV3IHBsdWdpbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzMi50ZXN0cy50b21jYXQudjU1LnBlcmZtc3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmF4aXMyLnRlc3RzLnRvbWNhdC52NTUuV1NXaXphcmRUb21jYXQ1NVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBlcmZvcm1hbmNlLnV0aWwuUGVyZm9ybWFuY2VKVW5pdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy51bml0dGVzdC5XU0pVbml0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy51dGlsLkpVbml0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnV0aWwuU2NlbmFyaW9Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLlBlcmZvcm1hbmNlTWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmVjbGlwc2UuQWNjdW11bGF0ZVN0YXR1c0hhbmRsZXI7Ci0KLS8qKgotICogVG9wIGRvd24gcGVyZm9ybWFuY2Ugc2NlbmFyaW8gd2l0aCBBeGlzMiBhbmQgVG9tY2F0IHY1LjUKLSAqLwotcHVibGljIGNsYXNzIFBlcmZtc3JUREphdmFBeGlzMlRDNTUgZXh0ZW5kcyBXU1dpemFyZFRvbWNhdDU1VGVzdCB7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgV1NfUlVOVElNRUlEX0FYSVMgPSBXU0pVbml0Q29uc3RhbnRzLldTX1JVTlRJTUVJRF9BWElTMjsKLSAgCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRSA9ICJUREF4aXMyV2ViIjsKLSAgCi0gIHByaXZhdGUgSUZpbGUgc291cmNlRmlsZV87Ci0JCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVByb2plY3RzKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkgICAgSVByb2plY3Qgd2ViUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChQUk9KRUNUX05BTUUpOwotCSAgICBpZiAoIXdlYlByb2plY3QuZXhpc3RzKCkpewotCSAgICAJSlVuaXRVdGlscy5jcmVhdGVXZWJNb2R1bGUoUFJPSkVDVF9OQU1FLCBQUk9KRUNUX05BTUUsIHNlcnZlcl8uZ2V0SWQoKSwgU0VSVkVSVFlQRUlEX1RDNTUsICIxNCIsIGVudl8sIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCSAgICB9Ci0JICB9Ci0JICAJICAKLSAgLyoqCi0gICAqIFNldHMgdXAgdGhlIGlucHV0IGRhdGE7Ci0gICAqIC0gY3JlYXRlIHByb2plY3QocyksCi0gICAqIC0gY29weSByZXNvdXJjZXMgdG8gd29ya3NwYWNlIAotICAgKi8gIAotCXByb3RlY3RlZCB2b2lkIGluc3RhbGxJbnB1dERhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQotCQlJUHJvamVjdCB3ZWJQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KFBST0pFQ1RfTkFNRSk7CQkKLQkJSUZvbGRlciBkZXN0Rm9sZGVyID0gKElGb2xkZXIpSjJFRVV0aWxzLmdldFdlYkNvbnRlbnRDb250YWluZXIod2ViUHJvamVjdCk7Ci0JCUpVbml0VXRpbHMuY29weVRlc3REYXRhKCJUREphdmEiLGRlc3RGb2xkZXIsZW52XywgbnVsbCk7Ci0JCXNvdXJjZUZpbGVfID0gZGVzdEZvbGRlci5nZXRGaWxlKG5ldyBQYXRoKCJFY2hvLndzZGwiKSk7Ci0JCUpVbml0VXRpbHMuZGlzYWJsZVZhbGlkYXRpb24od2ViUHJvamVjdCk7Ci0JCUpVbml0VXRpbHMuc3luY0J1aWxkUHJvamVjdCh3ZWJQcm9qZWN0LGVudl8sIG51bGwpOwotCX0KLQotICAvKioKLSAgICogU2V0IHRoZSBwZXJzaXN0ZW50IHNlcnZlciBydW50aW1lIGNvbnRleHQgcHJlZmVyZW5jZXMKLSAgICovICAKLQlwcm90ZWN0ZWQgdm9pZCBpbml0SjJFRVdTUnVudGltZVNlcnZlckRlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFNldCBkZWZhdWx0IHByZWZlcmVuY2VzIGZvciBBeGlzIGFuZCBUb21jYXQgdjUuNSBzZXJ2ZXIKLQkJSlVuaXRVdGlscy5zZXRXU1J1bnRpbWVTZXJ2ZXIoV1NfUlVOVElNRUlEX0FYSVMsIFNFUlZFUlRZUEVJRF9UQzU1KTsJCi0JCUpVbml0VXRpbHMuc2V0U2VydmljZVNjZW5hcmlvRGVmYXVsdCgpOwotCX0KLQotICAvKioKLSAgICogU2V0IHRoZSBpbml0aWFsIHNlbGVjdGlvbgotICAgKi8gIAotCXByb3RlY3RlZCB2b2lkIGluaXRJbml0aWFsU2VsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWluaXRpYWxTZWxlY3Rpb25fID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc291cmNlRmlsZV8pOwotCi0JfQotCi0gIC8qKgotICAgKiBMYXVuY2hlcyB0aGUgcG9wLXVwIGNvbW1hbmQgdG8gaW5pdGlhdGUgdGhlIHNjZW5hcmlvCi0gICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAqLyAgCi0JcHVibGljIHZvaWQgdGVzdFRESmF2YUF4aXMyVEM1NSgpIHRocm93cyBFeGNlcHRpb24gewotCSAgCi0JICAgIElTdGF0dXNbXSBzdGF0dXM7Ci0JCUpVbml0VXRpbHMuZW5hYmxlT3ZlcndyaXRlKHRydWUpOwotCQlKVW5pdFV0aWxzLnNldFJ1bnRpbWVQcmVmZXJlbmNlKFdTX0FYSVMyX1JVTlRJTUUpOwotCi0JCQotCQlQZXJmb3JtYW5jZSBwZXJmPSBQZXJmb3JtYW5jZS5nZXREZWZhdWx0KCk7Ci0JCVBlcmZvcm1hbmNlTWV0ZXIgcGVyZm9ybWFuY2VNZXRlcj0gcGVyZi5jcmVhdGVQZXJmb3JtYW5jZU1ldGVyKHBlcmYuZ2V0RGVmYXVsdFNjZW5hcmlvSWQodGhpcykpOwkgICAgCi0JICAgIHRyeSB7Ci0gICAgCi0JICAgICAgcGVyZm9ybWFuY2VNZXRlci5zdGFydCgpOwotCSAgICAgIHN0YXR1cyA9IFBlcmZvcm1hbmNlSlVuaXRVdGlscy5sYXVuY2hDcmVhdGlvbldpemFyZChTY2VuYXJpb0NvbnN0YW50cy5XSVpBUkRJRF9UT1BfRE9XTixTY2VuYXJpb0NvbnN0YW50cy5PQkpFQ1RfQ0xBU1NfSURfSUZJTEUsaW5pdGlhbFNlbGVjdGlvbl8pOwotCSAgICAgIHBlcmZvcm1hbmNlTWV0ZXIuc3RvcCgpOwotCSAgICAgIHBlcmZvcm1hbmNlTWV0ZXIuY29tbWl0KCk7Ci0JICAgICAgcGVyZi5hc3NlcnRQZXJmb3JtYW5jZShwZXJmb3JtYW5jZU1ldGVyKTsKLQkgICAgfQotCSAgICBmaW5hbGx5IHsKLQkgICAgCWlmIChwZXJmb3JtYW5jZU1ldGVyPT1udWxsKQotCSAgICAJCXBlcmZvcm1hbmNlTWV0ZXIuZGlzcG9zZSgpOwotCSAJfQotCSAgICAKLQkgICAgdmVyaWZ5T3V0cHV0KHN0YXR1cyk7Ci0KLQotCX0KLQotICAvKioKLSAgICogVmVyaWZ5IHRoZSBzY2VuYXJpbyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Ci0gICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAqLwotCXByaXZhdGUgZmluYWwgdm9pZCB2ZXJpZnlPdXRwdXQoSVN0YXR1c1tdIHN0YXR1cykgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLSAgICAgICAgSVByb2plY3Qgd2ViUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChQUk9KRUNUX05BTUUpOyAgICAKLQkJSUZvbGRlciB3ZWJDb250ZW50Rm9sZGVyID0gKElGb2xkZXIpSjJFRVV0aWxzLmdldFdlYkNvbnRlbnRDb250YWluZXIod2ViUHJvamVjdCk7Ci0gICAgCi0gICAgICAgIElGb2xkZXIgd2ViSW5mRm9sZGVyID0gd2ViQ29udGVudEZvbGRlci5nZXRGb2xkZXIoIldFQi1JTkYiKTsKLSAgICAgICAgSUZvbGRlciBzZXJ2aWNlc0ZvbGRlciA9IHdlYkluZkZvbGRlci5nZXRGb2xkZXIoInNlcnZpY2VzIik7Ci0JCWFzc2VydFRydWUoc2VydmljZXNGb2xkZXIuZXhpc3RzKCkpOwotCQlJRm9sZGVyIHdzRm9sZGVyID0gc2VydmljZXNGb2xkZXIuZ2V0Rm9sZGVyKCJFY2hvU2VydmljZSIpOwotCQlhc3NlcnRUcnVlKHdzRm9sZGVyLmV4aXN0cygpKTsKLQkJYXNzZXJ0VHJ1ZSh3c0ZvbGRlci5tZW1iZXJzKCkubGVuZ3RoID4gMCk7Ci0KLQkJQWNjdW11bGF0ZVN0YXR1c0hhbmRsZXIgc3RhdHVzSGFuZGxlciA9IG5ldyBBY2N1bXVsYXRlU3RhdHVzSGFuZGxlcihzdGF0dXMpOwotCQlJU3RhdHVzW10gcyA9IHN0YXR1c0hhbmRsZXIuZ2V0RXJyb3JSZXBvcnRzKCk7Ci0JCS8vCi0JCWlmIChzLmxlbmd0aCA+IDApewotCQkJZm9yIChpbnQgaT0wO2k8cy5sZW5ndGg7aSsrKXsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRESmF2YSBFcnJvciBtZXNzYWdlIGZvciByZXBvcnQgIyIraSsiOiAiK3NbaV0uZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKHMubGVuZ3RoID09IDApOwotCX0KLQkKLSAgLyoqCi0gICAqIENsZWFyIHdvcmtzcGFjZSBpZiByZXF1aXJlZAotICAgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVJbnB1dERhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gRGVsZXRlIHRoZSBXZWIgcHJvamVjdC4KLQkJSVByb2plY3Qgd2ViUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChQUk9KRUNUX05BTUUpOwotCQl3ZWJQcm9qZWN0LmRlbGV0ZSh0cnVlLHRydWUsbnVsbCk7Ci0JCQotCX0KLQotfQo=